MongoDB聚合查询各院系授课学生最多的讲师实现方法
MongoDB 查找各院系授课学生数最多讲师实现方案
完全可以在你现有聚合代码的基础上直接扩展实现,不需要修改前面已经写好的department和group集合关联逻辑,只需要在原有聚合管道的末尾追加几个处理阶段即可。
实现逻辑
- 遍历每个院系下的所有讲师,统计每位讲师所授所有课程的学生累计总数
- 对比同一院系下所有讲师的累计学生数,筛选出数值最高的讲师记录
- 整理字段输出为要求的格式
完整追加代码
把以下聚合阶段直接追加到你原有聚合代码的最后一个$group阶段之后即可:
// 为每位讲师计算累计授课学生数 { $set: { lectures: { $map: { input: "$lectures", as: "lecturer", in: { $mergeObjects: [ "$$lecturer", { totalStudents: { $reduce: { input: "$$lecturer.imparts", initialValue: 0, in: { $add: [ "$$value", { $size: { $ifNull: ["$$this.students", []] } } ] } } } } ] } } } } }, // 筛选出院系内学生数最高的讲师 { $set: { topLecturer: { $reduce: { input: "$lectures", initialValue: { totalStudents: -1 }, in: { $cond: [ { $gt: ["$$this.totalStudents", "$$value.totalStudents"] }, "$$this", "$$value" ] } } } } }, // 输出指定格式字段 { $project: { name: 1, faculty: 1, lecturerID: "$topLecturer.lecturerID", maxImpartsStudents: "$topLecturer.totalStudents" } }
补充说明
- 以上代码默认按照你给出的示例逻辑统计:直接累加每门课程
students数组的长度,同一学生重复选择同一讲师的多门课程会重复计数。如果需要统计去重后的学生总数,将第一个阶段中计算totalStudents的逻辑替换为以下代码即可:
totalStudents: { $size: { $setUnion: { $reduce: { input: "$$lecturer.imparts", initialValue: [], in: { $concatArrays: [ "$$value", { $ifNull: ["$$this.students.studentID", []] } ] } } } } }
- 代码中加入了
$ifNull做容错处理,避免某门课程下缺失students字段时聚合报错。 - 如果需要在最终结果中保留讲师姓名、邮箱等信息,只需要在最后一个
$project阶段增加对应字段映射即可。
内容的提问来源于stack exchange,提问作者Cristina Aranda
相关产品推荐
相关产品推荐

