2013-05-27 18 views
12

Data una base di dati sotto forma diraggruppamento nidificato con 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" } 
] 

Voglio primo gruppo per età e in secondo gruppo in base al sesso in modo che ho un risultato nidificato cercando qualcosa di simile

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

Qui è quello che ho provato finora:

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

Ma questo restituisce un {_id: null} come risultato. E 'possibile e in caso affermativo, come?

risposta

40

Qualcosa come questo dovrebbe farlo;

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

... che dà il risultato;

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

Se si desidera che l'età di _id come nel tuo esempio, basta sostituire la seconda del _id per gruppo;

_id: "$_id.age", 
+2

stavo cercando questo, come ho sempre cercato di ricreare, ma ancora una domanda come faccio a contare il genere? Quante volte un genere appare per ogni età? – RaduM

Problemi correlati