首页 > 解决方案 > 如何将所有子文档 _id 放入变量中

问题描述

我试图将家庭子文档 _ids 设置为变量。

这是我的架构:

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

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

将家庭子文档 _ids 放入变量的正确查询是什么?

标签: mongodbmongoose

解决方案


请试试这个:

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第一阶段轻松避免这种情况,正如您所说你可以得到 parent _id 然后用它$match来过滤文档


推荐阅读