2017-06-15 3 views
1

Ich habe in Mongodb differents Aufzeichnungen. Ich schreibe ein kleines Beispiel:

{_id:"sad547er4w2v5x85b8", name:"Jhon", jobTime:600, floor:2, dept:5, age:25}, 
{_id:"xcz547wer4xcvcx1g2", name:"Alex", jobTime:841, floor:4, dept:1, age:55}, 
{_id:"xcnwep2321954ldfsl", name:"Alice", jobTime:100, floor:3, dept:3, age:55}, 
{_id:"23s3ih94h548jhfk2u", name:"Anne", jobTime:280, floor:2, dept:8, age:22}, 
{_id:"03dfsk9342hjwq1503", name:"Alexa", jobTime:355, floor:2, dept:6, age:25} 

Ich habe versucht, diese Ausgabe zu erhalten, aber ich weiß nicht, wie zu einer Gruppe von zweimal, um diese Struktur zu bekommen.

{[ 
{age:22, floors:[{floor:2,persons:[{name:"Anne",jobTime:280,dept:8}]}]}, 
{age:25, floors:[{floor:2,persons:[{name:"Jhon",jobTime:600,dept:5},{name:"Alexa",jobTime:355,dept:6}]}]}, 
{age:55, floors:[{floor:3,persons:[{name:"Alex",jobTime:841,dept:1}]},{floor:4,persons:[{name:"Alice",jobTime:100,dept:3}]}]} 
]} 

Antwort

1

Genau. Verwenden Sie „zwei“ $group Stufen

collection.aggregate([ 
    { "$group": { 
    "_id": { 
     "age": "$age", 
     "floor": "$floor", 
    }, 
    "persons": { "$push": { 
     "name": "$name", 
     "jobTime": "$jobTime", 
     "dept": "$dept" 
    }} 
    }}, 
    { "$group": { 
    "_id": "$_id.age", 
    "floors": { "$push": { 
     "floor": "$_id.floor", 
     "persons": "$persons" 
    }} 
    }} 
],function(err,results) { 
    // deal with results here 
}) 

Welche produziert:

{ 
    "_id" : 25, 
    "floors" : [ 
    { "floor" : 2, 
     "persons" : [ 
     { "name" : "Jhon", "jobTime" : 600, "dept" : 5 }, 
     { "name" : "Alexa", "jobTime" : 355, "dept" : 6 } 
     ] 
    } 
    ] 
}, 
{ 
    "_id" : 55, 
    "floors" : [ 
    { "floor" : 3, 
     "persons" : [ 
     { "name" : "Alice", "jobTime" : 100, "dept" : 3 } 
     ] 
    }, 
    { "floor" : 4, 
     "persons" : [ 
     { "name" : "Alex", "jobTime" : 841, "dept" : 1 } 
     ] 
    } 
    ] 
}, 
{ 
    "_id" : 22, 
    "floors" : [ 
    { "floor" : 2, 
     "persons" : [ 
     { "name" : "Anne", "jobTime" : 280, "dept" : 8 } 
     ] 
    } 
    ] 
} 

So die anfängliche $group befindet sich auf einem Verbundschlüssel einschließlich das Detail bis auf die Elemente, die Sie in die Ausgangs „Array“ hinzufügen möchten, für "persons". Dann nimmt die zweite $group nur einen Teil der ursprünglichen _id für ihren Schlüssel und "schiebt" den Inhalt erneut in ein neues Array.

+0

Worsk wie ein Charme! Mein Problem war, dass ich zweimal Gruppe aber nicht wusste, dass ich de idFloor auf dieser Ebene einrichten musste. – kartGIS