2013-05-27 134 views
12

給定一個數據庫中,我想第一組嵌套分組與MongoDB的

[ 
{ gender: "m", age: 1, name: "A" }, 
{ gender: "f", age: 2, name: "B" }, 
{ gender: "m", age: 3, name: "C" }, 
{ gender: "f", age: 1, name: "D" }, 
{ gender: "m", age: 2, name: "E" }, 
{ gender: "f", age: 3, name: "F" }, 
{ gender: "m", age: 1, name: "G" }, 
{ gender: "f", age: 2, name: "H" }, 
{ gender: "m", age: 3, name: "I" }, 
{ gender: "f", age: 1, name: "J" } 
] 

形式按年齡和二組性別,讓我得到一個嵌套的結果看起來像

[{ 
    _id: "1", 
    children: [ 
     { _id: "f" }, 
     { _id: "m" } 
    ] 
}, { 
    _id: "2", 
    children: [ 
     { _id: "f" }, 
     { _id: "m" } 
    ] 
}, { 
    _id: "3", 
    children: [ 
     { _id: "f" }, 
     { _id: "m" } 
    ] 
}] 

這裏是我迄今爲止的嘗試:

db.example.aggregate(
{ $group: { _id: "$age", children: { $addToSet: { 
    age: "$age", gender: "$gender", name: "$name" 
}}}}, 
{ $group: { _id: "$children.gender"}} 
) 

但是,這返回{_id: null}作爲其結果。這是可能的,萬一是,如何?

回答

40

像這樣的東西應該這樣做;

db.example.aggregate( 
    { 
    $group: { 
     _id: { age: "$age", gender: "$gender" }, 
     names: { $addToSet: "$name" } 
    } 
    }, 
    { 
    $group: { 
     _id: { age: "$_id.age" }, 
     children: { $addToSet: { gender: "$_id.gender", names:"$names" } } 
    } 
    } 
) 

...給出結果;

{ 
    "_id" : { 
    "age" : 1 
    }, 
    "children" : [ 
    { "gender" : "m", "names" : [ "G", "A" ] }, 
    { "gender" : "f", "names" : [ "J", "D" ] } 
    ] 
}, 
... 

如果你想在年齡_id在你的榜樣,只需更換第二組通過的_id;

_id: "$_id.age", 
+2

我一直在尋找這個,因爲我一直試圖重新創建失敗,但還有一個問題我如何計算性別?每個年齡出現一次性別的次數? – RaduM