2013-05-27 14 views
12

einer Datenbank der Form vonNested Gruppierung mit 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" } 
] 

ich erster Gruppe will nach Alter und zweitens Gruppe nach Geschlecht gegeben, so dass ich eine verschachtelte Folge suche so etwas wie

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

Hier erhalten ist das, was ich bisher versucht:

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

Aber das gibt ein {_id: null} als Ergebnis. Ist das möglich und falls ja, wie?

Antwort

40

So etwas sollte es tun;

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

... was das Ergebnis ergibt;

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

Wenn Sie das Alter als _id wie in Ihrem Beispiel wollen, ersetzen Sie einfach die zweite Gruppierung der _id durch;

_id: "$_id.age", 
+2

Ich war auf der Suche nach diesem, wie ich die ganze Zeit versäumt zu versuchen, neu zu erstellen, aber eine weitere Frage, wie ich das Geschlecht zählen? Wie oft erscheint ein Geschlecht für jedes Alter? – RaduM