资讯专栏INFORMATION COLUMN

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

tomato / 1804人阅读

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

回顾 相关文章回顾

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

管道操作符的分类

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

阶段操作符(Stage Operators)

表达式操作符(Expression Operators)

累加器(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:  }

$project下使用:

{ $sum:  }
    or
{ $sum: [ ,  ... ]  }

说明:

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

举例:

请看后面的综合示例

$avg 求均值操作符

用法:

$group下使用

{ $avg:  }

$project下使用:

{ $avg:  }
    or
{ $avg: [ ,  ... ]  }

举例:

请看后面的综合示例

$first 求第一值操作符

用法:

{ $first:  }

举例:
假设数据:

[
    { _id: 1, name: "kate", class: "a" },
    { _id: 2, name: "jack", class: "a" },
    { _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:  }

举例:
假设数据:

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

操作:

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

结果:

[
    { _id: "a", firstPersonName: "jack" },
    { _id: "b", firstPersonName: "kent" },
]
$max 求最大值操作符

用法:

$group下使用

{ $max:  }

$project下使用:

{ $max:  }
    or
{ $max: [ ,  ... ]  }

举例:

请看后面的综合示例

$min 求最小值操作符

用法:

$group下使用

{ $min:  }

$project下使用:

{ $min:  }
    or
{ $min: [ ,  ... ]  }

举例:

请看后面的综合示例

综合示例

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

[
    { _id: 1, name: "kate", score: 80, class: "a", subject: "A" },
    { _id: 2, name: "kate", score: 60, class: "a", subject: "B" },
    { _id: 3, name: "jack", score: 90, class: "a", subject: "A" },
    { _id: 4, name: "jack", score: 60, class: "a", subject: "B" },
    { _id: 5, name: "nick", score: 80, class: "b", subject: "A" },
    { _id: 6, name: "nick", score: 90, class: "b", subject: "B" },
    { _id: 7, name: "kent", score: 50, class: "b", subject: "A" },
    { _id: 7, name: "kent", score: 30, class: "b", subject: "B" },
]
示例一

需求:

获取各科目的最高分

获取各科目的最低分

获取各科目的平均分

操作:

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", maxScore: 90, 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 }
]

感谢阅读~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/85157.html

相关文章

  • mongoDB查询进阶聚合管道() -- 加器(Accumulators)

    摘要:累加器累加器本来只能使用与下,但是版本或以上,部分累加器还能使用于。当在中使用时,累加器是针对每个分组使用的当在中使用时,累加器则是针对每个字面量起作用。 回顾 相关文章回顾 mongoDB查询进阶--聚合管道(一)回顾mongoDB查询进阶--聚合管道(二)回顾mongoDB查询进阶--聚合管道(三)回顾 管道操作符的分类 管道操作符可以分为三类: 阶段操作符(Stage Oper...

    wmui 评论0 收藏0
  • mongoDB查询进阶聚合管道(二) -- 阶段操作符

    摘要:当在中使用时,累加器是针对每个分组使用的当在中使用时,累加器则是针对每个字面量起作用,具体用法下一篇文章阐述。另外再加以配合表达式操作符组成的表达式或者在或中使用累加器能查询统计的内容会更加的多样化。 上篇最后说到管道操作符,本篇文章将详细说一下管道操作符。 mongoDB查询进阶--聚合管道(一)回顾 什么是管道操作符(Aggregation Pipeline Operators) ...

    brianway 评论0 收藏0
  • mongoDB查询进阶聚合管道(二) -- 阶段操作符

    摘要:当在中使用时,累加器是针对每个分组使用的当在中使用时,累加器则是针对每个字面量起作用,具体用法下一篇文章阐述。另外再加以配合表达式操作符组成的表达式或者在或中使用累加器能查询统计的内容会更加的多样化。 上篇最后说到管道操作符,本篇文章将详细说一下管道操作符。 mongoDB查询进阶--聚合管道(一)回顾 什么是管道操作符(Aggregation Pipeline Operators) ...

    flybywind 评论0 收藏0
  • mongoDB查询进阶聚合管道(三)--表达式操作符

    摘要:用法取反操作符,返回表达式中取反后的布尔值。用法示例假设有一个关于考试成绩的集合操作如下返回结果数学操作符操作符简述求绝对值操作符,于版新加入。用法进一法取整操作符,取于版新加入。用法切割操作符,用于对字符串进行分切。 回顾 相关文章回顾 mongoDB查询进阶--聚合管道(一)回顾mongoDB查询进阶--聚合管道(二)回顾 管道操作符的分类 管道操作符可以分为三类: 阶段操作符(...

    wenhai.he 评论0 收藏0
  • mongoDB查询进阶聚合管道(三)--表达式操作符

    摘要:用法取反操作符,返回表达式中取反后的布尔值。用法示例假设有一个关于考试成绩的集合操作如下返回结果数学操作符操作符简述求绝对值操作符,于版新加入。用法进一法取整操作符,取于版新加入。用法切割操作符,用于对字符串进行分切。 回顾 相关文章回顾 mongoDB查询进阶--聚合管道(一)回顾mongoDB查询进阶--聚合管道(二)回顾 管道操作符的分类 管道操作符可以分为三类: 阶段操作符(...

    v1 评论0 收藏0

发表评论

0条评论

tomato

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<