如何填充外部字段 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 数组?的主要内容,如果未能解决你的问题,请参考以下文章