MongoDB聚合 - 展开,分组和项目

时间:2014-09-05 08:24:56

标签: javascript node.js mongodb mongoose aggregation-framework

使用集合Users,是否可以检索以下唯一的组织/所有者列表?如果无法进行当前设置,是否可以通过一个查询从两个ID链接的集合中获得相同的结果?

目前,使用Mongoose我只能检索组织名称组:

当前查询

userModel.aggregate([ { $unwind:'$organisations' } , { $group: { name: '$organisations.name' } } ])


用户

{ "_id" : ObjectId("53f4a94e7c88310000000001"), 
  "email" : "bob@example.com",
  "organisations" : [
    {
      "name" : "OrgOne", 
      "isOwner" : true
    }
  ]
},
{ "_id" : ObjectId("53f4a94e7c88310000000002"), 
  "email" : "ash@something.com",
  "organisations" : [
    {
      "name" : "OrgOne"
    }
  ]
},
{ "_id" : ObjectId("53f4a94e7c88310000000003"), 
  "email" : "george@hello.com",
  "organisations" : [
    {
      "name" : "OrgTwo", 
      "isOwner" : true
    }
  ]
}

结果

{ "orgName" : "OrgOne", 
  "owner" : 53f4a94e7c88310000000001
},
{ "orgName" : "OrgTwo", 
  "owner" : 53f4a94e7c88310000000003
}

先谢谢你,尼克

1 个答案:

答案 0 :(得分:2)

似乎对我来说是一种奇怪的聚合使用,但是每个用户可能有几个“组织”,所以我想我会继续:

userModel.aggregate(
    [
        { "$match": { "organisations.isOwner": true } },
        { "$unwind": "$organisations" },
        { "$match": { "organisations.isOwner": true } },
        { "$group": { 
            "_id": "$organisations.name",
            "owner": { "$first": "$_id" }
        }} 
    ],
    function(err,result) {

    }
);

如果有多个所有者,并且您需要一些优先权,那么您可以在该群组之前实施 $sort 。或者只是 $project 而不是分组才能吸引所有人。