mongodb aggregate 做了什么?
我们在使用 mongodb 的 aggregate 操作的时候会传递一个数组参数,这个数组里面的每一项定义了这一步需要做的操作,然后把这一步的结果传递给数组下一个聚合操作,知道执行完所有操作。
MongoDB 的聚合框架以数据处理管道的概念为模型。文档进入多阶段流水线,该流水线将文档转换成汇总结果。
例子(来自官网)
假设我们有如下数据:
orders:
{
cust_id: "A123",
amount: 500,
status: "A"
},
{
cust_id: "A123",
amount: 250,
status: "A"
},
{
cust_id: "B212",
amount: 200,
status: "A"
},
{
cust_id: "A123",
amount: 300,
status: "D"
},
我们对这个 collection 执行如下操作:
db.orders.aggregate([
{ $match: { status: "A" } },
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } }
])
这个操作做了什么?
首先,根据传递的条件筛选出符合条件的数据
{ $match: { status: "A" } },
首先,筛选出 status
为 "A"
的记录。这个过程会得到下面的记录:
{
cust_id: "A123",
amount: 500,
status: "A"
},
{
cust_id: "A123",
amount: 250,
status: "A"
},
{
cust_id: "B212",
amount: 200,
status: "A"
}
然后,根据 cust_id 分组,并且统计 amount 的总数
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } }
$group
表明我们要对上一步的结果进行分组,_id
表明我们需要根据 "$cust_id""
来分组,相同 cust_id
的数组分为一组,最后,$sum
表明我们需要根据后面的表达式来当前分组执行求和操作,求和的字段为 amount
。
这个过程会得到下面的结果:
{
_id: "A123",
total: 750
},
{
_id: "B212",
total: 200
}