2013-05-07 143 views
1

我有移动设备的集合,我想统计每个制造商的设备,也计算每个模型。所有我能得到迄今:MongoDB聚合与双金额

{ $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}]} 

回答

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 
}