Mongoose聚合:如何基于tutorInfo获取不重复数据
解决MongoDB聚合结果中导师信息重复的问题
要获取tutorInfo不重复的唯一文档列表,需要调整聚合管道的执行顺序,先对导师信息去重,再进行分页和关联查询。修改后的聚合逻辑如下:
const allQuestionBySubject = await QuestionParts.aggregate([ // 筛选指定学科且存在导师信息的文档 { $match: { subject: subjectIncrementalId, tutorInfo: { $exists: true } } }, // 按导师增量ID分组去重,保留每组第一个完整文档 { $group: { _id: "$tutorInfo.tutorIncrementalId", doc: { $first: "$$ROOT" } } }, // 将分组后保留的文档还原为根结构 { $replaceRoot: { newRoot: "$doc" } }, // 对去重后的导师列表执行分页 { "$skip": page * limit }, { "$limit": limit }, // 关联profiles集合获取导师详情 { $lookup: { from: "profiles", localField: "tutorInfo.tutorIncrementalId", foreignField: "incrementalId", as: "tutorDetails" } } ])
关键逻辑说明:
- $group去重:通过
tutorInfo.tutorIncrementalId作为分组依据,用$first保留每组的第一个文档,确保每个导师仅对应一条QuestionParts记录。 - 调整分页顺序:将
$skip和$limit移至去重之后,保证分页是针对去重后的唯一导师列表进行,避免原逻辑中先分页再去重导致的结果遗漏。 - $replaceRoot还原结构:把分组后存在
doc字段中的原文档还原为根节点,保持最终结果的结构与原查询一致。
内容的提问来源于stack exchange,提问作者user21005847
相关产品推荐
相关产品推荐

