如何在MongoDB中对文档数组内的_id执行$lookup关联查询
MongoDB数组类型ObjectId字段$lookup关联查询解决方案
MongoDB 3.2及以上版本的$lookup天然支持直接匹配数组类型的关联字段,无需额外拆分数组,可直接使用如下聚合语句实现关联查询:
db.Department.aggregate([ // 关联Designations集合 { $lookup: { from: "Designations", // 目标关联集合名称 localField: "designationId", // Department集合的关联字段(数组类型可直接匹配) foreignField: "_id", // Designations集合的关联主键 as: "designationList" // 关联结果存储的自定义字段名 } }, // 可选配置:如果需要将单条关联结果合并到文档顶级,可添加以下阶段,不需要可直接省略 { $replaceRoot: { newRoot: { $mergeObjects: [ { $arrayElemAt: [ "$designationList", 0 ] }, "$$ROOT" ] } } }, // 可选配置:删除冗余的关联结果字段 { $project: { designationList: 0 } } ])
注意事项
- 你提供的示例文档中,Department的
designationId值为ObjectId("60b5d6483cad3268ec30a513"),但给出的Designations文档的_id为ObjectId("60b5cf7d3cad3268ec30a4c7"),二者ID不匹配,调试时请先确认存在对应_id的Designations文档,避免返回空关联结果。 - 如果你使用的MongoDB版本低于3.2,不支持直接匹配数组类型字段,可先通过
$unwind拆分数组后再执行关联,兼容语句如下:
db.Department.aggregate([ // 拆分designationId数组 { $unwind: "$designationId" }, { $lookup: { from: "Designations", localField: "designationId", foreignField: "_id", as: "designationInfo" } }, // 合并拆分后的文档,恢复数组结构 { $group: { _id: "$_id", originDoc: { $first: "$$ROOT" }, designationList: { $push: { $arrayElemAt: [ "$designationInfo", 0 ] } } } }, // 还原原始文档结构 { $replaceRoot: { newRoot: { $mergeObjects: [ "$originDoc", { designationList: "$designationList" } ] } } }, // 删除冗余字段 { $project: { designationInfo: 0 } } ])
内容的提问来源于stack exchange,提问作者Ratnesh Choudhary
相关产品推荐
相关产品推荐

