MongoDB嵌套Lookup求助:如何将parent字段关联为完整文档
解决MongoDB嵌套Lookup的问题
别担心,这个嵌套关联的需求其实很常见,咱们一步步来实现你想要的结果!
首先先明确一下假设的集合结构(你可以根据自己的实际集合名称调整):
classes集合:存储你的初始文档,结构如{ "_id": "445454", "students": ["7894556", "5454454"] }students集合:存储学生信息,每个文档结构如{ "_id": "7894556", "name": "Jose", "parent": "45566622" }parents集合:存储家长信息,每个文档结构如{ "_id": "45566622", "name": "Cristy" }
下面提供两种实现方案,你可以根据自己的MongoDB版本选择:
方案一:使用嵌套$lookup + $map(MongoDB 3.6+ 推荐)
这种方法不需要拆分数组,效率更高,直接在数组元素上完成二次关联:
db.classes.aggregate([ // 先匹配到目标班级文档 { $match: { _id: "445454" } }, // 第一次Lookup:把学生ID数组替换为完整的学生文档 { $lookup: { from: "students", localField: "students", foreignField: "_id", as: "students" } }, // 第二次关联:遍历students数组,把每个学生的parent ID替换为完整家长文档 { $addFields: { students: { $map: { input: "$students", as: "student", in: { name: "$$student.name", parent: { // $lookup返回的是数组,用$arrayElemAt取第一个匹配的家长文档 $arrayElemAt: [ { $lookup: { from: "parents", localField: "$$student.parent", foreignField: "_id", as: "parentDoc" } }, 0 ] } } } } } } ])
方案二:使用$unwind + $lookup + $group(兼容旧版本MongoDB)
如果你的MongoDB版本低于3.6,可以用这种拆分组装的方式:
db.classes.aggregate([ { $match: { _id: "445454" } }, // 第一次Lookup获取学生基础信息 { $lookup: { from: "students", localField: "students", foreignField: "_id", as: "students" } }, // 拆分数组,让每个学生成为独立的文档 { $unwind: "$students" }, // 第二次Lookup关联家长信息 { $lookup: { from: "parents", localField: "students.parent", foreignField: "_id", as: "students.parent" } }, // 把parent字段从数组转为单个对象 { $addFields: { "students.parent": { $arrayElemAt: ["$students.parent", 0] } } }, // 重新将学生文档组合回数组 { $group: { _id: "$_id", students: { $push: "$students" } } } ])
执行任意一种方案后,你就能得到想要的结果:
{ "_id": "445454", "students": [{ "name": "Jose", "parent": { "_id": "45566622", "name": "Cristy" } }, { "name": "Mathew", "parent": { "_id": "7889665", "name": "Abraham" } }] }
内容的提问来源于stack exchange,提问作者PRAVEEN KUMAR T
相关产品推荐
相关产品推荐

