MongoDB中findOne查询返回false,请求协助排查原因
问题分析与解决方案
核心原因:查询参数错误
Mongoose 的 findOne() 方法第一个参数必须是查询条件对象,你直接传入 userId,相当于让 MongoDB 查询 _id 字段等于该值的文档,但你的文档是用自定义的 userId 字段来区分用户的,自然匹配不到任何数据,导致 data 为 null(!!data 结果就是 false)。
修正方案
1. 修复查询条件,改用 async/await 写法(更清晰易维护)
module.exports.addItem = async (userId, item) => { try { // 正确匹配自定义 userId 字段 const data = await profileSchema.findOne({ userId }); console.log('There is data: ' + !!data); if (data) { // 简化判断:直接处理物品数量 data.items[item] = (data.items[item] || 0) + 1; await data.save(); // 直接保存修改后的文档 } else { // 可选:如果用户不存在,自动创建新文档 await profileSchema.create({ userId, items: { [item]: 1 } }); } } catch (err) { console.error('数据库操作出错:', err); } };
2. 更高效的原子操作写法(减少数据库查询次数)
用 findOneAndUpdate 结合 MongoDB 更新操作符,一次完成查询+更新,不存在则自动创建:
module.exports.addItem = async (userId, item) => { try { await profileSchema.findOneAndUpdate( { userId }, { $inc: { [`items.${item}`]: 1 } }, // 自动累加,物品不存在则设为1 { upsert: true, new: true } // upsert: 无匹配则创建;new: 返回更新后的文档 ); } catch (err) { console.error('数据库操作出错:', err); } };
额外检查点
- 确认
profileSchema中确实定义了userId字段,且字段类型和传入的userId一致(比如都是字符串类型)。 - 验证传入的
userId值是否正确,有没有拼写、格式错误(比如是否和数据库中存储的用户ID完全匹配)。
内容的提问来源于stack exchange,提问作者Slimey
相关产品推荐
相关产品推荐

