我有移动设备的集合,我想为每个制造商计算设备,并计算每个型号。我到目前为止所能得到的只有:
{ $group : {
_id : "$hw.man",
mantotal : { $sum : 1 },
models : { $addToSet : "$hw.mod" }
} }
result:
[{"_id":"LGE","mantotal":1,"models":["GT540"]},{"_id":"asus","mantotal":1,"models":["Nexus 7"]},{"_id":"samsung","mantotal":3,"models":["GT-I9300","GT-I9200"]}]
或
{ $group : {
_id : { man : "$hw.man", mod : "$hw.mod" },
total : { $sum : 1 } }
}
result:
[{"_id":{"man":"LGE","mod":"GT540"},"total":1},{"_id":{"man":"asus","mod":"Nexus 7"},"total":1},{"_id":{"man":"samsung","mod":"GT-I9300"},"total":2},{"_id":{"man":"samsung","mod":"GT-I9200"},"total":1}]
我怎样才能达到这样的结果:
{"_id":"samsung","mantotal":3,"models":[{mod: "GT-I9300", modtotal: 2}, {mod: "GT-I9200", modtotal: 1}]}
答案 0 :(得分:2)
假设您有一个代表手机的简单文档集合,列出其制造商和型号,如下所示:
> db.phones.find({},{_id:0})
{ "man" : "LG", "mod" : "GT540" }
{ "man" : "LG", "mod" : "AB123" }
{ "man" : "Apple", "mod" : "iPhone4" }
{ "man" : "Apple", "mod" : "iPhone5" }
{ "man" : "Apple", "mod" : "iPhone5" }
{ "man" : "LG", "mod" : "GT540" }
{ "man" : "LG", "mod" : "GT540" }
{ "man" : "Samsung", "mod" : "Galaxy" }
以下是如何按制造商和型号编号多次分组以获取总数和小计:
> gg1 =
{
"$group" : {
"_id" : {
"ma" : "$man",
"mo" : "$mod"
},
"subTotals" : {
"$sum" : 1
}
}
}
> gg2 =
{
"$group" : {
"_id" : "$_id.ma",
"total" : {
"$sum" : "$subTotals"
},
"models" : {
"$push" : {
"mod" : "$_id.mo",
"sub" : "$subTotals"
}
}
}
}
> db.phones.aggregate(gg1, gg2)
{
"result" : [
{
"_id" : "LG",
"total" : 4,
"models" : [
{
"mod" : "AB123",
"sub" : 1
},
{
"mod" : "GT540",
"sub" : 3
}
]
},
{
"_id" : "Apple",
"total" : 3,
"models" : [
{
"mod" : "iPhone5",
"sub" : 2
},
{
"mod" : "iPhone4",
"sub" : 1
}
]
},
{
"_id" : "Samsung",
"total" : 1,
"models" : [
{
"mod" : "Galaxy",
"sub" : 1
}
]
}
],
"ok" : 1
}