具有数组值之和的MongoDB聚合
我收集了以下数据:具有数组值之和的MongoDB聚合,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我收集了以下数据: { "_id" : ObjectId("5516d416d0c2323619ddbca8"), "date" : "28/02/2015", "driver" : "user1", "passengers" : [ { "user" : "user2", "times" : 2 }, { "user" : "user3",
{
"_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}]
对于user3:[{driver:user1,times:3},{driver:user2,times:2}]
我对mongo很陌生,知道如何使用sum进行简单的聚合,但当它在数组中时,以及当我的主题本身在数组中时,我就不知道了。
执行此类聚合的适当方式是什么,更具体地说,我是如何在基于express.js的服务器中执行的?为了满足您对聚合框架的需求,第一个管道阶段将是对相关乘客的操作,该操作将文档与乘客阵列中的用户相匹配,然后是从上一个操作中的输入文档解构乘客数组以输出每个元素的文档的操作。解构数组上的另一个
$match
操作将进一步过滤前一个文档流,只允许匹配的文档未经修改地传递到下一个管道阶段,该阶段将使用操作符投影所需字段。因此,基本上,user3
的聚合管道如下:
db.collection.aggregate([
{
“$match”:{
“乘客.用户”:“用户3”
}
},
{
“$放松”:“$乘客”
},
{
“$match”:{
“乘客.用户”:“用户3”
}
},
{
“$project”:{
“_id”:0,
“驱动程序”:“$driver”,
“次”:“$passengers.times”
}
}
])
结果:
/* 0 */
{
"result" : [
{
"total" : 2,
"driver" : "user2"
},
{
"total" : 3,
"driver" : "user1"
}
],
"ok" : 1
}
/*0*/
{
“结果”:[
{
“驱动程序”:“用户1”,
《时代》:3
},
{
“驱动程序”:“用户2”,
《时代》:2
}
],
“好”:1
}
更新:
/* 0 */
{
"result" : [
{
"total" : 2,
"driver" : "user2"
},
{
"total" : 3,
"driver" : "user1"
}
],
"ok" : 1
}
要将不同日期的驾驶员上的重复项分组,如您所述,您可以在最后一个$project
管道阶段之前执行操作,在该阶段中,您可以使用$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
}
看看$REWIND:谢谢,这非常接近我的需求(它没有将不同日期的重复驾驶员分组)。最后我使用了一个
$group:{“\u id”:“$driver”,“total”:{$sum:$passengers.times”}
,