管道聚合
聚合操作aggregate
是使用管道pipeline
将来自多个文档的值组合在一起,并通过对分组数据执行各种操作以返回计算后的结果,如统计平均值、求和
管道由多个阶段组成,每个阶段在文档沿着管道传递时都会对其进行处理。文档按顺序通过各个阶段。
聚合操作比较复杂耗时,应注意优化,如尽量先用$match
和$limit
/$skip
把需要用到的数据先提取出来再操作
管道操作符
| 过滤数据,只输出符合条件的文档。可用各种查询操作 |
| 将文档分组,用于统计结果。 |
| 修改输入文档的结构,比如重命名,增加、删除字段,创建计算结果等 |
| 将结果进行排序后输出 |
| 限制管道返回的文档数 |
| 跳过指定数量的文档,并返回余下的文档 |
| 左外连接 left outer join |
| 将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值 |
| 输出接近某一地理位置的有序文档 |
表达式操作符 Accumulator
| 求和, $sum: 1 表示以一倍计数 |
| 求平均值 |
| 求最小值 |
| 求最大值 |
| 将结果文档中插入值到一个数组中 |
| 根据文档的排序获取第一个文档数据 |
| 同理,获取最后一个文档 |
例子
求每个客户已支付的订单总额。注:一个客户存在多个订单
[{ $match: { z: { $exists: true }} }, { $group: { _id: "$auth", total: { $sum: "$total" } } }]
求南山区各辅导站人数
[{ $match: {"x.区属": "南山区"} }, { $group: { _id: "$x.辅导站", count: { $sum: 1 }}}]
求学生总数和平均年龄
[{ $match: {"x.type": "学生"} }, { $group: { _id: null, count: { $sum: 1 }, avg_age: { $avg: "$x.age" }}}]
与MySQL类比
Mongo | MySQL |
---|---|
$match | where |
$group | group by |
$match | having |
$project | select |
$sort | order by |
$limit | limit |
$sum | sum() |
$lookup | join |