聚合操作aggregate
是使用管道将来自多个文档的值组合在一起,并通过对分组数据执行各种操作以返回计算后的结果,如统计平均值、求和
管道由多个阶段组成,每个阶段在文档沿着管道传递时都会对其进行处理。文档按顺序通过各个阶段。第一个阶段应该用$match
把需要用到的数据先提取出来再统计。
$match | 过滤数据,只输出符合条件的文档。可用各种查询操作 |
$limit | 限制管道返回的文档数 |
$skip | 跳过指定数量的文档,并返回余下的文档 |
$unwind | 将包含数组的字段拆分成多个文档,每个文档只包含一个数组元素 |
$group | 将文档分组,用于统计结果。 |
$sort | 将结果进行排序后输出 |
$project | 修改输入文档的结构,如重命名、增加、删除字段、创建计算结果(1表示显示,0不显示) |
$sum | 求和, $sum: 1 表示以一倍计数 |
$avg | 求平均值 |
$min | 求最小值 |
$max | 求最大值 |
求每个客户已支付的订单总额。注:一个客户存在多个订单
[{ $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" }}}]
财务系统中的【凭证汇总表】根据凭证分录中的借贷金额统计各科目的收支总额
[{ $match: { type: "凭证"} }, { $unwind: { path: "$x.分录" } }, { $group: {_id: "$x.分录.科目", 收入总额: { $sum: "$x.分录.借" }, 支出总额: { $sum: "$x.分录.贷" } }]
财务系统中的【核算项目组合表】可以组合两种辅助核算的维度来统计,比如统计各部门的各种存货的收支情况
[{ $match }, { $unwind }, { $group: { _id: { 客户: "$x.分录.核算.客户", 部门: "$x.分录.核算.部门" }, 借: { $sum: "$x.分录.借" }, 贷: { $sum: "$x.分录.贷" } } }]
SQL | Mongo |
---|---|
where | $match |
group by | $group |
having | $match |
select | $project |
order by | $sort |
limit | $limit |
sum() | $sum |
聚合可以非常复杂,详情请参考官网文档