Mongodb 3.2聚合$查找嵌套文档

时间:2016-01-25 16:00:22

标签: mongodb mongoose mongodb-query aggregation-framework

我有两个集合:成员资格和类别。 在类别中,我存储了名为ageGroups的对象数组。

memberships : [{
   _id: ObjectId,
   ageCategory: ObjectId,
   ageGroup: ObjectId
}]

categories: {
   _id: ObjectId,
   ageGroups: [{
       _id: ObjectId,
       name: String
       }, {
       _id: ObjectId,
       name: String
       }, {
       _id: ObjectId,
       name: String
   }]
}

会员资格集合中有ageCategoryageGroup个属性。 现在我需要聚合这两个并得到像这样的结果

[{
  id: 'membership id here',
  ageGroup: 'Age Group name here'
},{
  id: '2 membership id here',
  ageGroup: '2 membership age Group name here'
}]

所以我试过

db.memberships.aggregate([
    {
        $lookup: {
            from: 'categories', localField: 'ageCategory', foreignField: '_id', as: 'ageCategory'
        }
    },
    {
        $unwind: '$ageCategory'
    },
    {
        $project: {
          'group': {
             $filter: { 
                  input : '$ageCategory.ageGroups', 
                  as    : 'group',
                  cond : 'group._id' == '$_id'
             }
           }
        }
    },
    {
      $unwind: '$group'
    },
    {
        $project: {
            'group' : '$group.name'
        }
    }
]);

此查询返回空结果。据我所知,过滤条件中的问题

$filter: { input : '$ageCategory.ageGroups', as : 'group', cond : 'group._id' == '$_id' } 当我尝试在true中设置cond时,它会为每个组推送新文档到结果,即使ageGroup不是那个,也被分配给成员资格。谢谢你的帮助!

UPD 我找到了解决方案,

{
    $project: {
        'group': {
             $filter: { 
                  input : '$ageCategory.ageGroups', 
                  as    : 'group',
                  cond : { $eq:['$$group._id', '$ageGroup']}
             }
         }
     }
 },

我已经使用$ eq运算符添加了双美元符号,问题已经解决。现在我搜索更好的解决方案,我想要一个得到类似结果的查询

{ 
    "_id" : // member id, 
    "group" : "1-3 members"
}
{ 
    "_id" : //member id, 
    "group" : "17-19 members"
}

不在会员资格表中存储ageCategory,仅使用ageGroup id。

0 个答案:

没有答案