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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 08:27:26