如何使用Mongoose查询指定学生已报名的所有课程?
问题原因分析
你的查询写法存在两处核心问题:
$in针对对象数组匹配时,要求完全匹配对象的所有字段值和类型,只要有一个字段不匹配就会查询失败,且你完全不需要同时匹配studentName和studentID,用全局唯一的studentID做匹配条件就足够。- 嵌套数组字段的查询不需要套
$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
相关产品推荐
相关产品推荐

