如何填充外部字段 ID 的 MongoDB 数组?

Posted

技术标签:

【中文标题】如何填充外部字段 ID 的 MongoDB 数组?【英文标题】:How do I populate a MongoDB array of foreign field IDs? 【发布时间】:2021-05-16 02:34:18 【问题描述】:

我的 MongoDB 文档中有一个 ObjectId 数组,我想使用 Go(特别是 mgo.v2)执行查询,用它们引用的文档中的数据填充它们。例如:


  _id: ObjectId("some_id"),
  events: [
    ObjectId("referenced_id_1"),
    ObjectId("referenced_id_2")
  ]

我希望查询以以下格式返回文档:


  _id: ObjectId("some_id"),
  events: [
    
      _id: ObjectId("referenced_id_1"),
      name: "some_name_1"
    ,
    
      _id: ObjectId("referenced_id_2"),
      name: "some_name_2"
    
  ]

据我所知,我需要使用$lookup,然后是$unwind,但似乎无法弄清楚。任何帮助将不胜感激!谢谢:)

【问题讨论】:

所以您想要查询可以转换数据并搜索其他数据来填充它?我怀疑 mongo 可以做那些复杂的事情,你总是可以从一个文档中读取 ID,然后查询它们以获取相关信息。解析数据时,您可以使用仅包含您感兴趣的字段的结构,这样程序就不会浪费时间来解析未使用的字段。 嗨@JakubDóka,您可以在NodeJS .populate('event', 'name') 中使用Mongoose 非常简单地做到这一点......所以我希望在mgo.v2 中有一个等价的Go。如果不是,那么是的,我将不得不做多个查询。 【参考方案1】:

我相信你想做这样的事情:

db.getCollection("some_collection").aggregate([
     $match:  _id: ObjectId("some_id")  ,

     // match events ids and then replace field "events" with the matching results
     $lookup: 
            from: "referenced_collection",
            localField: "events",
            foreignField: "_id",
            as: "events"
    

    // there is no need for an $unwind step here since the expected output requires "events" to be an array
])

上面的查询使用了$lookup 的简化版本,假设您不需要pre-$project 的“事件”$lookup 结果,也不需要使用额外的匹配键。如果您确实需要这些东西,我建议您查看 MongoDB 的文档以进行必要的改进。

【讨论】:

以上是关于如何填充外部字段 ID 的 MongoDB 数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何将每个数组字段与MongoDB中的其他字段匹配

MongoDB 查询聚合 localField ObjectId 字符串和外部字段 ObjectId

MongoDB/Mongoose:在填充字段中排序

MongoDB:如何找出数组字段是不是包含元素?

如何在mongodb的对象数组中获取指定字段的值

如何根据MongoDB中文档字段中的每个数组项过滤集合