MongoDB聚合lookup结果继续关联grade、section集合的实现方法咨询
MongoDB聚合多关联实现方案
核心实现步骤
- 先将第一次
$lookup得到的classDetails数组展开,单条匹配场景下会转换为对象格式,方便后续引用内部字段 - 若
gradedetails、sectiondetails集合的_id为ObjectId类型,需先将classDetails中字符串格式的gradeId、sectionId转换为ObjectId;若两个集合的_id本身就是字符串类型,可跳过转换步骤 - 分别执行两次
$lookup,依次关联gradedetails和sectiondetails集合 - 可选配置:新增
$project阶段按需整理输出字段,隐藏冗余的中间转换字段
完整示例查询
db.assignmentdetails.aggregate([ // 原有阶段:匹配指定assignment _id { "$match": { _id: ObjectId("614887ee0e02d153ecc6dbc3") } }, // 原有阶段:转换className为ObjectId { "$addFields": { "convertedClassId": { $toObjectId: "$className" } } }, // 原有阶段:关联combinedgradesectiondetails集合 { "$lookup": { "from": "combinedgradesectiondetails", "localField": "convertedClassId", "foreignField": "_id", "as": "classDetails" } }, // 展开classDetails数组为对象 { $unwind: "$classDetails" }, // 转换gradeId、sectionId为ObjectId用于后续关联 { "$addFields": { "classDetails.convertedGradeId": { $toObjectId: "$classDetails.gradeId" }, "classDetails.convertedSectionId": { $toObjectId: "$classDetails.sectionId" } } }, // 关联gradedetails集合 { "$lookup": { "from": "gradedetails", "localField": "classDetails.convertedGradeId", "foreignField": "_id", "as": "gradeInfo" } }, // 展开gradeInfo数组,若需保留关联不到的原数据可添加参数 preserveNullAndEmptyArrays: true { $unwind: "$gradeInfo" }, // 关联sectiondetails集合 { "$lookup": { "from": "sectiondetails", "localField": "classDetails.convertedSectionId", "foreignField": "_id", "as": "sectionInfo" } }, // 展开sectionInfo数组 { $unwind: "$sectionInfo" }, // 可选:整理输出字段,不需要的字段设为0隐藏 { "$project": { "convertedClassId": 0, "classDetails.convertedGradeId": 0, "classDetails.convertedSectionId": 0 } } ])
内容的提问来源于stack exchange,提问作者DhanaLaxshmi
相关产品推荐
相关产品推荐

