MongoDB中如何通过引用ID对对象数组执行lookup关联并保留其他属性
MongoDB 嵌套引用数组关联查询实现方案
需求说明
需要对collectionA中嵌套的refs数组,通过数组内对象的id字段关联collectionB的_id字段,将collectionB中对应的name字段合并到refs的对应对象中,返回指定格式的结果。
实现代码
直接执行如下聚合查询即可得到预期结果:
db.collectionA.aggregate([ // 关联collectionB,获取所有匹配的B集合文档存入临时字段b_docs { $lookup: { from: "collectionB", localField: "refs.id", foreignField: "_id", as: "b_docs" } }, // 重构refs数组,合并B集合的name字段 { $addFields: { refs: { $map: { input: "$refs", as: "ref", in: { $mergeObjects: [ "$$ref", { // 匹配当前ref.id对应的B集合文档的name字段 name: { $arrayElemAt: [ "$b_docs.name", { $indexOfArray: ["$b_docs._id", "$$ref.id"] } ] } } ] } } } } }, // 删除临时关联字段,返回需要的字段 { $project: { b_docs: 0 } } ])
兼容说明
上述写法兼容MongoDB 3.2及以上版本,无需高版本语法支持。如果是MongoDB 4.4及以上版本,也可以使用$getField语法替换name字段的取值逻辑,效果完全一致。
内容的提问来源于stack exchange,提问作者Vu Le Anh
相关产品推荐
相关产品推荐

