【mongoDB查询进阶】聚合管道(四) -- 累加器(Accumulators)

前端之家收集整理的这篇文章主要介绍了【mongoDB查询进阶】聚合管道(四) -- 累加器(Accumulators)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

回顾

相关文章回顾

mongoDB查询进阶--聚合管道(一)回顾
mongoDB查询进阶--聚合管道(二)回顾
mongoDB查询进阶--聚合管道(三)回顾

管道操作符的分类

管道操作符可以分为三类:

  1. 阶段操作符(Stage Operators)
  2. 表达式操作符(Expression Operators)
  3. 累加器(Accumulators)

参考MongoDB官网:https://docs.mongodb.com/manual/reference/operator/aggregation

本篇主要内容是管道操作符中的累加器。

累加器(Accumulators)

累加器本来只能使用与$groud下,但是版本3.2或以上,部分累加器还能使用于$project。当在$group中使用时,累加器是针对每个分组使用的;当在$project中使用时,累加器则是针对每个字面量起作用。

常用累加器

操作符 简述
$sum 求和操作符,v3.2+可以用于$group或是$poject
$avg 求均值操作符,v3.2+可以用于$group或是$poject
$first 用于返回分组的第一个值,只能用于$group
$last 用于返回分组的最后一个值,只能用于$group
$max 用于返回分组的最大值,v3.2+可以用于$group或是$poject
$min 用于返回分组的最小值,v3.2+可以用于$group或是$poject

$sum 求和操作符

用法

  • $group下使用
{ $sum: <expression> }
  • $project下使用:
{ $sum: <expression> }
    or
{ $sum: [ <expression1>,<expression2> ... ]  }

说明:

列子 结果
{ $sum : <field> } 只含数字 所有值的和
{ $sum : <field> } 含数字和非数字 所有数字值的和
{ $sum : <field> } 非数字或不存在 0

举例:

请看后面的综合示例

$avg 求均值操作符

用法

  • $group下使用
{ $avg: <expression> }
  • $project下使用:
{ $avg: <expression> }
    or
{ $avg: [ <expression1>,<expression2> ... ]  }

举例:

请看后面的综合示例

$first 求第一值操作符

用法

{ $first: <expression> }

举例:
假设数据:

[
    { _id: 1,name: 'kate',class: 'a' },{ _id: 2,name: 'jack',{ _id: 3,name: 'kent',class: 'b' },]

操作:

db.collection.aggregate(
   [
     {
       $group:
         {
           _id: "$class",firstPersonName: { $first: "$name" }
         }
     }
   ]
)

结果:

[
    { _id: 'a',firstPersonName: 'kate' },{ _id: 'b',firstPersonName: 'kent' },]

$last 求最后值操作符

用法

{ $last: <expression> }

举例:
假设数据:

[
    { _id: 1,firstPersonName: { $last: "$name" }
         }
     }
   ]
)

结果:

[
    { _id: 'a',firstPersonName: 'jack' },]

$max 求最大值操作符

用法

  • $group下使用
{ $max: <expression> }
  • $project下使用:
{ $max: <expression> }
    or
{ $max: [ <expression1>,<expression2> ... ]  }

举例:

请看后面的综合示例

$min 求最小值操作符

用法

  • $group下使用
{ $min: <expression> }
  • $project下使用:
{ $min: <expression> }
    or
{ $min: [ <expression1>,<expression2> ... ]  }

举例:

请看后面的综合示例

综合示例

假设有一个关于成绩的集合

[
    { _id: 1,score: 80,class: 'a',subject: 'A' },score: 60,subject: 'B' },score: 90,{ _id: 4,{ _id: 5,name: 'nick',class: 'b',{ _id: 6,{ _id: 7,score: 50,score: 30,]

示例一

需求:

操作:

db.collection.aggregate(
   [
     {
       $group:
         {
           _id: "$subject",maxscore: { $max: '$score' },minscore: { $min: '$score' },avgscore: { $avg: '$score' },}
     }
   ]
)

结果:

[
    { _id: 'A',maxscore: 90,minscore: 50,avgscore: 75 },{ _id: 'B',minscore: 30,avgscore: 60 },]

示例二

需求:

  • 获取每人的总分
  • 从高到低排序

操作:

db.collection.aggregate(
   [
     {
       $group:
         {
           _id: "$name",totalscore: { $sum: '$score' }
         }
     },{
        $sort: { totalscore: -1 } 
     },{
        $project: {
            _id: 0,name: '$_id',totalscore: 1,}
     }
   ]
)

结果:

[
    { name: 'nick',totalscore: 170 },{ name: 'jack',totalscore: 150 },{ name: 'kate',totalscore: 140 },{ name: 'kent',totalscore: 80 }
]

感谢阅读~

猜你在找的设计模式相关文章