如何用MongoDB查询同时选修课程1和课程2的学生记录?
要找出同时申请了课程1和课程2的学生,这里有几种实用的MongoDB查询方案,适配你提供的选课数据结构:
方法1:聚合框架(推荐,灵活易扩展)
这个方案通过分组收集每个学生的选课列表,再筛选出同时包含两门目标课程的记录,逻辑清晰还能应对后续的扩展需求:
db.mycollection.aggregate([ // 按学生ID分组,收集该学生所有选修的课程(自动去重) { $group: { _id: "$student", enrolledCourses: { $addToSet: "$course" } } }, // 筛选出选课列表同时包含课程1和课程2的学生 { $match: { enrolledCourses: { $all: [1, 2] } } }, // 调整输出格式,只返回学生ID字段(可选,让结果更整洁) { $project: { _id: 0, student: "$_id" } } ])
方法2:用$setIsSubset替代$all实现匹配
和方法1逻辑一致,只是用集合子集判断来替代数组全匹配,语义上更直观:
db.mycollection.aggregate([ { $group: { _id: "$student", enrolledCourses: { $addToSet: "$course" } } }, { $match: { $expr: { // 判断[1,2]是否是学生选课集合的子集 $setIsSubset: [[1, 2], "$enrolledCourses"] } } }, { $project: { _id: 0, student: "$_id" } } ])
方法3:针对无重复选课数据的简化方案
如果能确保每个学生每门课程只会有一条记录,还可以通过统计选课数量来快速筛选:
db.mycollection.aggregate([ // 先过滤出只涉及课程1和2的记录,减少后续计算量 { $match: { course: { $in: [1, 2] } } }, // 按学生分组,统计选课数量并收集课程列表 { $group: { _id: "$student", courseCount: { $sum: 1 }, enrolledCourses: { $addToSet: "$course" } } }, // 筛选出恰好选了2门课,且两门课正是目标课程的学生 { $match: { courseCount: 2, enrolledCourses: { $all: [1, 2] } } }, { $project: { _id: 0, student: "$_id" } } ])
以上三种方案都会返回符合要求的学生:student: 1和student: 2。
内容的提问来源于stack exchange,提问作者Parag122
相关产品推荐
相关产品推荐

