mongoDB中的多个$组

时间:2017-06-15 10:45:08

标签: node.js mongodb aggregation-framework

我有mongodb不同的记录。我写下一个小例子:

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

1 个答案:

答案 0 :(得分:1)

完全。使用“两个”$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的一部分,并再次将内容“推送”到新数组中。