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

MongoDB $lookup返回空数组:获取儿童主题完成状态

问题分析与解决

你的studenttopic返回空数组的核心原因是:在$lookup的匹配条件中,直接对数组类型的字段使用$eq比较。subjectDetails和topicDetails都是数组,$subjectDetails.subjectid会返回一个包含所有subjectid的数组,和单个的$$subjectid比较永远不相等,导致没有匹配结果。

下面是修正后的聚合代码,同时帮你获取到主题的completestatus:

edcontentmaster.aggregate([
  {
    $match: {
      stageid: stageid,
      subjectid: subjectid,
      boardid: boardid,
      scholarshipid: scholarshipid,
    },
  },
  {
    $addFields: {
      convertedField: {
        $cond: {
          if: { $eq: ["$slcontent", ""] },
          then: "$slcontent",
          else: { $toInt: "$slcontent" },
        },
      },
    },
  },
  {
    $sort: {
      convertedField: 1, // 改用转换后的字段排序,避免字符串排序逻辑错误
    },
  },
  {
    $group: {
      _id: "$topic",
      topicimage: { $first: "$topicimage" },
      topicid: { $first: "$topicid" },
      sltopic: { $first: "$sltopic" },
      reviewquestionsets: {
        $push: {
          id: "$_id",
          sub: "$sub",
          topic: "$topic",
          contentset: "$contentset",
          stage: "$stage",
          timeDuration: "$timeDuration",
          contentid: "$contentid",
          studentdata: "$studentdata",
          subjectImage: "$subjectimage", // 修正原拼写错误:subjectIamge -> subjectimage
          topicImage: "$topicimage",
          contentImage: "$contentimage",
          isPremium: "$isPremium",
        },
      },
    },
  },
  {
    $lookup: {
      from: "edchildrevisioncompleteschemas",
      let: { targetChildId: childid, targetSubjectId: subjectid, targetTopicId: "$topicid" },
      pipeline: [
        // 匹配指定儿童
        { $match: { $expr: { $eq: ["$childid", "$$targetChildId"] } } },
        // 展开subjectDetails数组,方便筛选对应科目
        { $unwind: "$subjectDetails" },
        // 匹配目标subjectid的科目
        { $match: { $expr: { $eq: ["$subjectDetails.subjectid", "$$targetSubjectId"] } } },
        // 展开该科目下的topicDetails数组
        { $unwind: "$subjectDetails.topicDetails" },
        // 匹配目标topicid的主题
        { $match: { $expr: { $eq: ["$subjectDetails.topicDetails.topicid", "$$targetTopicId"] } } },
        // 提取需要的完成状态字段
        {
          $project: {
            _id: 0,
            childid: 1,
            completestatus: "$subjectDetails.topicDetails.completestatus"
          }
        }
      ],
      as: "studenttopic",
    },
  },
  {
    $project: {
      _id: 0,
      topic: "$_id",
      topicimage: 1,
      topicid: 1,
      sltopic: 1,
      studenttopic: 1,
      reviewquestionsets: 1,
    },
  },
])

关键修正点:

  1. 数组匹配逻辑:通过$unwind逐层展开嵌套数组,精准筛选匹配的儿童、科目和主题,确保能正确关联到目标数据。
  2. 排序逻辑优化:使用转换后的数字类型字段排序,避免字符串排序(如"10"排在"2"前面)的错误。
  3. 字段修正:修正了原代码中subjectIamge的拼写错误,保证数据映射正确。
  4. 返回有效数据:在关联结果中加入了主题的completestatus,满足你获取完成状态的需求。

内容的提问来源于stack exchange,提问作者Rajesh Senapati

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 22:58:10