Mongoose查询指定iduser的score数据返回全集合内容故障求助
问题原因排查
- 过滤条件字段名不匹配
你在Schema中定义的存储用户ID的字段是iduser,但执行查询时写的过滤条件是{ ids },这个字段在你的集合中不存在。Mongoose执行查询时,如果过滤条件的字段不存在于集合中,该条件会被忽略,等效于执行无过滤的find(),自然返回集合全部数据。
- 过滤条件字段名不匹配
- User查询混用异步语法
你查询用户信息时同时使用了直接赋值和回调函数,此时user变量拿到的是Mongoose的Query对象而非实际的查询结果,后续调用user.quiz无法拿到正确值。
- User查询混用异步语法
- 渲染参数缺少作用域
渲染模板时你使用了session.user.name,但全局没有session变量,实际存储用户信息的是req.session,此处会抛出未定义错误。
- 渲染参数缺少作用域
解决方法
修改后的/result接口代码如下:
router.get('/result', auth, async(req, res) => { try { const userId = req.session.user._id.toString(); // 统一转成字符串,避免ObjectId和字符串类型不匹配 // 修正用户查询写法,用await获取真实查询结果 const user = await User.findById(userId).exec(); if (!user) { return res.status(404).send('用户不存在'); } // 修正查询条件,使用Schema中实际存在的iduser字段 const notes = await storescors16.find({ iduser: userId }).exec(); res.render('./options/result', { notes: notes, scor: user.quiz, title: 'سجل درجات النجم', name: req.session.user.name, // 补充req作用域 email: req.session.user.email, }) } catch (err) { console.error('查询出错:', err); res.status(500).send('服务器错误'); } });
另外建议你在提交数据的接口中,也把req.session.selectuserid转成字符串再存入iduser字段,保证存储和查询的类型完全一致:
var scor = new storescors16({ iduser: req.session.selectuserid.toString(), level: level, day: day, date: date, time: time, objectif: ob, })
内容的提问来源于stack exchange,提问作者JANATI MOHAMMED
相关产品推荐
相关产品推荐

