MongoDB 6.0基于多课程ID字段递归获取文档的实现问题
解决MongoDB同时基于两个数组字段的递归关联查询问题
核心思路是先把文档里的mandatoryCourseIds和electiveCourseIds合并成一个统一的数组字段,让$graphLookup可以基于这个单一字段做递归关联查询,具体实现步骤如下:
1. 合并两个课程ID数组
用$addFields阶段,结合$mergeArrays和$ifNull处理数组可能不存在的情况,生成一个包含所有课程ID的新字段allCourseIds:
{ $addFields: { allCourseIds: { $mergeArrays: [ { $ifNull: ["$mandatoryCourseIds", []] }, { $ifNull: ["$electiveCourseIds", []] } ] } } }
这样不管文档里只有其中一个数组还是两个都有,allCourseIds都会包含所有关联的课程ID。
2. 执行递归查询
先匹配初始输入的_id数组,再合并数组,最后用$graphLookup递归查找所有共享课程ID的文档:
db.yourCollection.aggregate([ // 第一步:匹配初始输入的_id数组 { $match: { _id: { $in: [1, 8] } // 替换成你的输入_id数组 } }, // 第二步:合并两个课程ID数组 { $addFields: { allCourseIds: { $mergeArrays: [ { $ifNull: ["$mandatoryCourseIds", []] }, { $ifNull: ["$electiveCourseIds", []] } ] } } }, // 第三步:递归查找所有关联文档 { $graphLookup: { from: "yourCollection", startWith: "$allCourseIds", connectFromField: "allCourseIds", connectToField: "allCourseIds", as: "relatedDocuments", maxDepth: 100 // 可以根据实际情况调整最大递归深度 } }, // 可选:合并初始文档和关联文档,并去重 { $project: { allDocuments: { $concatArrays: [ [ "$$ROOT" ], "$relatedDocuments" ] } } }, { $unwind: "$allDocuments" }, { $replaceRoot: { newRoot: "$allDocuments" } }, { $group: { _id: "$_id", doc: { $first: "$$ROOT" } } }, { $replaceRoot: { newRoot: "$doc" } }, // 可选:移除临时字段allCourseIds { $project: { allCourseIds: 0 } } ])
关键说明
$graphLookup的startWith用初始文档的allCourseIds,确保从这些课程ID开始递归查找所有关联的文档。connectFromField和connectToField都用合并后的allCourseIds,这样只要两个文档共享任意一个课程ID(不管属于原mandatory还是elective数组),就会被关联起来。- 最后的去重步骤是避免同一个文档被多次返回(比如初始文档可能在关联结果里重复出现)。
内容的提问来源于stack exchange,提问作者cis
相关产品推荐
相关产品推荐

