mongoDB中有多个$组

我有在mongodb不同的logging。 我写下一个小例子:

{_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} 

我试图获得这个结果,但我不知道如何分组两次才能得到这个结构。

 {[ {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}]}]} ]} 

究竟。 使用“两个” $group阶段

 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 }) 

其中产生:

 { "_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 } ] } ] } 

所以最初的$group是在一个复合键上,包括细节,直到你想添加到初始“数组”的项目, "persons" 。 然后第二个$group只取得初始_id一部分作为密钥,再次将内容“推”到一个新的数组中。