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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:12:42