MongoDB:如何$查找数组中的字段?

时间:2017-02-16 01:38:06

标签: mongodb mongodb-query aggregation-framework

我正在尝试为文档中的嵌入式数组检索一些查找数据。以下是数据样本:

[
   {
      "_id": "58a4fa0e24180825b05e14e9",
      "user_id": "589cf6511b94281f34617a13",
      "user": {
         "firstname": "John",
         "lastname": "Doe"
      },
      "stages": [
         {
            "user_id": "589cf6511b94281f34617a13"
         },
         {
            "user_id": "589cf6511b94281f346343c3"
         }
      ],
   }
]

如您所见,stages是一个数组,仅包含user_id个字段。这些指向另一个名为_id的集合中的users字段。

以下是我获得上述结果的方法:

db.collection('things').aggregate([{
        $match: finder
    },
    {
        $lookup: {
            from: 'users',
            localField: 'user_id',
            foreignField: '_id',
            as: 'user'
        }
    },
    {
        $unwind: '$user'
    }
]);

现在,这非常简单:选择一些记录,user字段用$lookup查找。但是我如何对stages的元素做同样的事情呢?期望的结果是:

[
   {
      "_id": "58a4fa0e24180825b05e14e9",
      "user_id": "589cf6511b94281f34617a13",
      "user": {
         "firstname": "John",
         "lastname": "Doe"
      },

      "stages": [
         {
            "user_id": "589cf6511b94281f34617a13",
            "firstname": "John",
            "lastname": "Doe"
         },
         {
            "user_id": "589cf6511b94281f346343c3"
            "firstname": "Jane",
            "lastname": "Doe"
         }
      ],
   }
]

1 个答案:

答案 0 :(得分:1)

我相信你所缺少的是在阶段中的放松和在它之后的群组通话。我测试了以下代码并得到了类似的结果:

db.collection('things').aggregate([
               { $match: finder },
               { $lookup: {  from: 'users',
                             localField: 'user_id',
                              foreignField: '_id',
                              as: 'user'
                           }
               },
               { $unwind: '$stages' },
               {$lookup : {from : 'users', localField: 'stages.user_id', foreignField: '_id', as : 'stages'}},
               {$group : { _id: '$_id', userId: "$userId",..., stages: {$push : "$stages"}}}
               ]);

希望我的代码很有用