聚合函数
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值、求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])Code language: CSS (css)
以上实例类似sql语句:
select by_user, count(*) from mycol group by by_userCode language: JavaScript (javascript)
在上面的例子中,通过字段 by_user 对数据进行分组,并计算 by_user 字段相同值的总和。
常用聚合表达式
| 表达式 | 描述 | 实例 |
|---|---|---|
| $sum | 计算总和 | db.mycol.aggregate([{group : {_id : “by_user”, num_tutorial : {sum:”likes”}}}]) |
| $avg | 计算平均值 | db.mycol.aggregate([{group : {_id : “by_user”, num_tutorial : {avg:”likes”}}}]) |
| $min | 获取集合中所有文档对应值得最小值 | db.mycol.aggregate([{group : {_id : “by_user”, num_tutorial : {min:”likes”}}}]) |
| $max | 获取集合中所有文档对应值得最大值 | db.mycol.aggregate([{group : {_id : “by_user”, num_tutorial : {max:”likes”}}}]) |
| $push | 在结果文档中插入值到一个数组中 | db.mycol.aggregate([{group : {_id : “by_user”, url : {push:”url”}}}]) |
| $addToSet | 在结果文档中插入值到一个数组中,但不创建副本 | db.mycol.aggregate([{group : {_id : “by_user”, url : {addToSet:”url”}}}]) |
| $first | 根据资源文档的排序获取第一个文档数据 | db.mycol.aggregate([{group : {_id : “by_user”, first_url : {first:”url”}}}]) |
| $last | 根据资源文档的排序获取最后一个文档数据 | db.mycol.aggregate([{group : {_id : “by_user”, last_url : {last:”url”}}}]) |
示例
db.persons.aggregate([{$group : {_id : "$age", personscount : {$sum : 1}}}])
db.persons.aggregate([{$group : {_id : "$age", personscount : {$avg : 1}}}])Code language: CSS (css)
统计函数
db.persons.count()Code language: CSS (css)
计算总数。
db.persons.count({age:22})Code language: CSS (css)
先过滤再统计。
补充说明
- aggregate() 接收的是一个管道数组,每个元素是一个阶段(stage),按顺序依次处理
- group阶段中id指定分组字段,前缀 表示引用文档中的字段值
- sum:1表示每组每匹配一条文档计数加1,等价于count(∗);sum : “$age” 表示对 age 字段求和
- avg:1表示每组固定值1求平均,通常写成avg : “$age” 才有实际意义
- push和addToSet 的区别:push允许重复值,addToSet 自动去重
- first和last 依赖输入文档的顺序,通常需要先配合 $sort 阶段使用才有确定结果
- count() 在 MongoDB 4.0+ 也支持用 db.collection.countDocuments() 替代,后者基于聚合实现,结果更可靠
db.persons.countDocuments()
db.persons.countDocuments({age:22})Code language: CSS (css)
Previous: 索引
Next: C#中使用Mongodb