[英]MongoDB Aggregation with sum of array values
我有一个包含以下数据的集合:
{
"_id" : ObjectId("5516d416d0c2323619ddbca8"),
"date" : "28/02/2015",
"driver" : "user1",
"passengers" : [
{
"user" : "user2",
"times" : 2
},
{
"user" : "user3",
"times" : 3
}
]
}
{
"_id" : ObjectId("5516d517d0c2323619ddbca9"),
"date" : "27/02/2015",
"driver" : "user2",
"passengers" : [
{
"user" : "user1",
"times" : 2
},
{
"user" : "user3",
"times" : 2
}
]
}
我想进行汇总,以便对于某个乘客,知道与某位驾驶员一起的时间,在我的示例中,它将是:对于user1: [{ driver: user2, times: 2}]
对于user2: [{ driver: user1, times: 2}]
: [{ driver: user1, times: 3}, {driver: user2, times:2}]
我对mongo相当陌生,并且知道如何使用sum进行简单的聚合,但不知道其在数组内部以及我的主题本身在数组中的时间。 什么是执行这种聚合的合适方法,更具体地说,如何在基于express.js的服务器中执行该聚合?
为了使用聚合框架满足您的需求,第一个流水线阶段将是对有问题的乘客执行$match
操作,以将文件与乘客数组中的用户进行匹配,然后是$unwind
操作,该操作从输入文档中解构乘客数组在上一个操作中为每个元素输出一个文档。 在解构后的数组上执行的另一个$match
操作将进一步过滤以前的文档流,以仅允许匹配的文档未经修改地传递到下一个管道阶段,该阶段将使用$project
运算符投影所需的字段。 因此,基本上,您的user3
聚合管道将如下所示:
db.collection.aggregate([
{
"$match": {
"passengers.user": "user3"
}
},
{
"$unwind": "$passengers"
},
{
"$match": {
"passengers.user": "user3"
}
},
{
"$project": {
"_id": 0,
"driver": "$driver",
"times": "$passengers.times"
}
}
])
结果 :
/* 0 */
{
"result" : [
{
"driver" : "user1",
"times" : 3
},
{
"driver" : "user2",
"times" : 2
}
],
"ok" : 1
}
更新 :
如前所述,要对具有不同日期的驱动程序上的重复项进行分组,您可以在最后一个$project
管道阶段之前执行$group
操作,在该阶段您可以使用$sum
运算符计算总乘客时间:
db.collection.aggregate([
{
"$match": {
"passengers.user": "user3"
}
},
{
"$unwind": "$passengers"
},
{
"$match": {
"passengers.user": "user3"
}
},
{
"$group": {
"_id": "$driver",
"total": {
"$sum": "$passengers.times"
}
}
},
{
"$project": {
"_id": 0,
"driver": "$_id",
"total": 1
}
}
])
结果 :
/* 0 */
{
"result" : [
{
"total" : 2,
"driver" : "user2"
},
{
"total" : 3,
"driver" : "user1"
}
],
"ok" : 1
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.