mongoDB-聚合上的聚合?
我有大约500条这种格式的记录:mongoDB-聚合上的聚合?,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有大约500条这种格式的记录: { "_id" : ObjectId( "51ac1356c59151b66c0c9b6b" ), "device" : "SomeString", "carrier" : "Cell C(ZA)" } 我要找的是不同运营商的列表,每个运营商的设备数量和每个设备的设备数量 以下是我迄今为止所尝试的: db.records.aggregate( { $project : { carrier : 1,
{
"_id" : ObjectId( "51ac1356c59151b66c0c9b6b" ),
"device" : "SomeString",
"carrier" : "Cell C(ZA)"
}
我要找的是不同运营商的列表,每个运营商的设备数量和每个设备的设备数量
以下是我迄今为止所尝试的:
db.records.aggregate(
{ $project : {
carrier : 1,
device : 1,
} },
{ $group : {
_id : { carrier : "$carrier" },
numDevice : {$sum:1},
devices : { $addToSet : "$device"}
} },
{ $sort: { numDevice: 1 }
});
以下是输出:
{ "result" : [
{
"_id" : {
"carrier" : "Saudi Telecom Company (SA)"
},
"numDevice" : 229,
"devices" : [
"SomeString1",
"SomeString2
]
},
{
"_id" : {
"carrier" : "AT&FU (US)"
},
"numDevice" : 392,
"devices" : [
"SomeString1",
"SomeString2",
"SomeString3"
]
}
], "ok" : 1 }
这与我需要/想要的非常接近,但理想情况下,我希望看到每个设备部分如下所示:
{
"_id" : {
"carrier" : "AT&FU (US)"
},
"numDevice" : 315,
"devices" : [
{"SomeString1", 83},
{"SomeString2", 17},
{"SomeString5", 215},
]
}
请注意,devices数组有多个对象,每个对象都有一个字符串和一个计数。在上面的示例中,设备SomeString1在“AT&FU US”运营商的集合中有83个“事件”
目前,我所能发现的是,运营商“AT&FU US”有392个SomeStringX与之相关
可以通过对聚合管道的子调用来实现这一点,还是需要使用map reduce?如果我需要执行map reduce,我将如何执行它?下面是如何执行的。关键是a你需要做$group两次,b你需要先按你想要的小计进行$group,然后再进行$group以获得总计
db.records.aggregate(
{$group:
{_id : {d:"$device",c:"$carrier"},
subtotal:{$sum:1}}
},
{$group:
{_id:"$_id.c",
devices:{$push:{device:"$_id.d", subtotal:"$subtotal"}},
total:{$sum:"$subtotal"}}
}
)
下面是如何做到这一点。关键是a你需要做$group两次,b你需要先按你想要的小计进行$group,然后再进行$group以获得总计
db.records.aggregate(
{$group:
{_id : {d:"$device",c:"$carrier"},
subtotal:{$sum:1}}
},
{$group:
{_id:"$_id.c",
devices:{$push:{device:"$_id.d", subtotal:"$subtotal"}},
total:{$sum:"$subtotal"}}
}
)
您可以使用聚合框架来实现这一点。我可以发布答案,或者我可以先给你一个提示,如果你想自己解决这个问题……你可以用聚合框架来完成。我可以把答案贴出来,或者我可以先给你一个提示,如果你想自己弄明白的话……谢谢你,这正是我需要的。我知道我可以通过管道发送多个组请求,但我不认为每个设备和运营商都有第一个ID。我会投票支持这一点,但我仍然没有15分的“声誉”。多谢,这是我的荣幸。这个聚合技巧的酷之处在于,一旦你看到它,你就会意识到它可以用于各种有用的多级聚合……谢谢你,这正是我所需要的。我知道我可以通过管道发送多个组请求,但我不认为每个设备和运营商都有第一个ID。我会投票支持这一点,但我仍然没有15分的“声誉”。多谢,这是我的荣幸。这个聚合技巧最酷的一点是,一旦你看到它,你就会意识到它可以用于各种有用的多级聚合。。。