You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 04:40:02