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, }, }, ])
关键修正点:
- 数组匹配逻辑:通过
$unwind逐层展开嵌套数组,精准筛选匹配的儿童、科目和主题,确保能正确关联到目标数据。 - 排序逻辑优化:使用转换后的数字类型字段排序,避免字符串排序(如"10"排在"2"前面)的错误。
- 字段修正:修正了原代码中
subjectIamge的拼写错误,保证数据映射正确。 - 返回有效数据:在关联结果中加入了主题的
completestatus,满足你获取完成状态的需求。
内容的提问来源于stack exchange,提问作者Rajesh Senapati
相关产品推荐
相关产品推荐

