【问题标题】:How do I populate a MongoDB array of foreign field IDs?如何填充外部字段 ID 的 MongoDB 数组?
【发布时间】: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。如果不是,那么是的,我将不得不做多个查询。

标签: mongodb go mongodb-query mgo


【解决方案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 的文档以进行必要的改进。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 2013-11-03
    • 2020-12-01
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多