2013-05-27 5 views
12

Biorąc pod uwagę bazę danych formaZagnieżdżone grupowanie z 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" } 
] 

Chcę pierwszej grupy według wieku i drugie grupy według płci, tak aby uzyskać zagnieżdżony wynik szuka czegoś podobnego

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

Tutaj to, co starałem dotąd:

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

Ale to zwraca {_id: null} jej wyniku. Czy to możliwe, a jeśli tak, to w jaki sposób?

Odpowiedz

40

Coś takiego powinno wystarczyć;

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

... co daje wynik;

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

Jeśli chcesz wiek jako _id jak w przykładzie, wystarczy zastąpić drugie ugrupowania _id przez;

_id: "$_id.age", 
+2

Szukałem tego, ponieważ cały czas nie udało mi się odtworzyć, ale jeszcze jedno pytanie, jak policzyć płeć? Ile razy pojawia się płeć dla każdego wieku? – RaduM