如何将所有子文档_id放入变量

时间:2019-08-18 03:14:56

标签: mongodb mongoose

我正在尝试将家庭子文档_ids更改为变量。

这是我的架构:

families: [
    {
      _id: {
        type: mongoose.Types.ObjectId
      },
      name: {
        type: String
      },
      relation: {
        type: String
      }
    }
  ]

问题是,我可以让parent的_id显示在变量内部,但是当我试图获取家族的_ids在控制台日志中显示undefined时。

将家庭子文档_ids转换为变量的正确查询是什么?

1 个答案:

答案 0 :(得分:0)

请尝试:

db.yourCollection.aggregate([
    { $unwind: '$families' },
    { $project: { Ids: '$families._id' } }, { $group: { '_id': '$_id', subDocumentsIDs: { $push: '$Ids' } } }
])

输出:

/* 1 */
{
    "_id" : ObjectId("5d58d3205a0d22d3c85d16f1"),
    "subDocumentsIDs" : [ 
        ObjectId("5d570b350e2fb4f72533d512"), 
        ObjectId("5d570b350e2fb4f71533d510"), 
        ObjectId("5d570b350e2fb4172533d511")
    ]
}

/* 2 */
{
    "_id" : ObjectId("5d58d3105a0d22d3c85d1591"),
    "subDocumentsIDs" : [ 
        ObjectId("5d570b350e2fb4f72533d312"), 
        ObjectId("5d570b350e2fb4f71533d310"), 
        ObjectId("5d570b350e2fb4172533d311")
    ]
}

请以这为基本示例,并在需要时进行增强,如果您的集合包含大型数据集,则类似$unwind的早期阶段会对性能产生影响,但是您可以通过以下方式轻松避免这种情况如前所述,使用$match作为第一阶段,您可以获取父_id,然后在$match中使用它来过滤文档