2013-05-07 141 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 
}