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

如何使用Mongoose查询指定学生已报名的所有课程?

问题原因分析

你的查询写法存在两处核心问题:

  1. $in 针对对象数组匹配时,要求完全匹配对象的所有字段值和类型,只要有一个字段不匹配就会查询失败,且你完全不需要同时匹配studentName和studentID,用全局唯一的studentID做匹配条件就足够。
  2. 嵌套数组字段的查询不需要套$in,直接用点语法指定数组内的字段路径,Mongoose会自动匹配数组中是否存在符合条件的元素。
修正后的实现代码

1. 拉取单个学生已报名的全部课程列表

router.post("/:id", async (req, res) => {
  try {
    // 查询用户
    const user = await User.findOne({
      username: req.body.username,
      email: req.body.email,
      password: req.body.password,
    });
    // 增加用户不存在的判断,避免空指针报错
    if (!user) return res.status(404).json("用户不存在");

    // 修正后的查询:匹配students数组中studentID等于当前用户ID的所有课程
    const coursesList = await Course.find({
      "students.studentID": user._id
    });
    res.status(200).json(coursesList);
  } catch (err) {
    res.status(500).json(err.message);
  }
});

2. 判断学生是否报名了指定课程

如果需要判断指定学生是否报名了某一门课程,用以下查询即可:

// 参数:studentID 学生ID,courseID 待校验的课程ID
const checkEnrolled = async (studentID, courseID) => {
  // 只要查询到1条符合条件的记录,说明已报名
  const count = await Course.countDocuments({
    _id: courseID,
    "students.studentID": studentID
  });
  return count > 0;
}
额外注意

你的代码里直接用明文密码做查询匹配是非常不安全的,生产环境请务必用bcrypt等加密库对密码做哈希存储后再做校验。

内容的提问来源于stack exchange,提问作者guy hazut

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:15:03