我有大约500份这种格式的记录:
{
"_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},
]
}注意,设备数组有对象,每个对象有一个字符串,有一个计数。在上面的示例中,设备SomeString1在“AT&FU(US)”carrier的集合中有83‘出现’
目前,我所能发现的是carrier'AT&FU (美国)‘有392个"SomeStringX“与之相关。
可以通过对聚合管道的子调用来做到这一点,或者我是否需要使用map还原?--如果我需要进行映射减少,我将如何做呢?
发布于 2013-06-05 05:41:02
这是怎么做的。关键是:(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"}}
}
)https://stackoverflow.com/questions/16930039
复制相似问题