回顾
相关文章回顾
管道操作符的分类
管道操作符可以分为三类:
- 阶段操作符(Stage Operators)
- 表达式操作符(Expression Operators)
- 累加器(Accumulators)
本篇主要内容是管道操作符中的累加器。
累加器(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 : <field> } | 只含数字 | 所有值的和 |
{ $sum : <field> } | 含数字和非数字 | 所有数字值的和 |
{ $sum : <field> } | 非数字或不存在 | 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 }]
感谢阅读~