Express+MongoDB+Mongoose架构下查询返回错误ID对象问题求助
问题分析与解决方案
嘿,我看你遇到了一个典型的查询逻辑问题——明明控制台打印的ID是正确的,结果查出来的却是旧文档,这大概率是你的查询条件写偏了。
先看你的核心查询代码:
const womanData = await User.findOne({womanid}).select('_id name age photos')
这里的{womanid}是ES6的简写语法,等价于{womanid: womanid},也就是说你在让Mongoose去查找**womanid字段等于传入值**的文档,但根据你的描述,前端传的是文档的_id值,这完全不是一回事啊!
几个可能的原因和对应的修复方法:
最可能的原因:查询字段搞混了
你应该是想根据文档的_id来查询,而不是自定义的womanid字段。把查询条件改成下面这样就行:// 明确指定查询_id字段 const womanData = await User.findOne({_id: womanid}).select('_id name age photos')如果你确实是要查
womanid这个字段,那得先确认前端传的是不是这个字段的有效值,而不是文档的_id。可选:处理ObjectId类型转换
虽然Mongoose一般会自动把字符串转成MongoDB的ObjectId,但偶尔也会有转换异常的情况,你可以显式转换一下:const mongoose = require('mongoose'); // 把传入的字符串ID转为ObjectId类型 const targetId = mongoose.Types.ObjectId(womanid); const womanData = await User.findOne({_id: targetId}).select('_id name age photos')少见情况:Mongoose缓存搞的鬼
极少数时候,Mongoose的文档缓存会返回旧数据,你可以加个lean()方法绕过缓存,直接拿到原始的JSON数据:const womanData = await User.findOne({_id: womanid}).select('_id name age photos').lean()
额外验证建议:
- 先去MongoDB的shell里手动查一下,确认
6210915b2b72a91fe72d9201这个_id对应的文档到底存在不存在:
记得把db.users.findOne({_id: ObjectId("6210915b2b72a91fe72d9201")})users换成你实际的集合名称哈。 - 检查你的
User模型定义,确认有没有womanid这个字段,以及它存的值是不是符合你的预期。
这样调整后,应该就能解决你查错文档的问题了。
内容的提问来源于stack exchange,提问作者Олег Денисов
相关产品推荐
相关产品推荐

