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

如何使用Mongoose判断MongoDB中是否存在指定记录?

解决Mongoose中findOne()判断文档存在的问题

你的代码核心问题是**findOne()是异步方法**,直接赋值给doc得到的是Promise对象,而非实际的查询结果,所以doc == null永远不成立,导致判断逻辑失效。以下是修正方案:

关键修正点

  • 使用async/await(或回调)处理异步查询,确保拿到真实的文档结果
  • 避免全局变量,改用参数传递数据
  • 数据库连接只需初始化一次,不要重复调用
  • 增加错误处理,避免静默失败

修正后的完整代码

const mongoose = require('mongoose');

// 数据库连接只初始化一次
mongoose.connect("mongodb://localhost/my_database", { useNewUrlParser: true })
  .then(() => console.log('数据库连接成功'))
  .catch(err => console.error('数据库连接失败:', err));

// 假设你已定义user模型(示例)
// const user = mongoose.model('User', new mongoose.Schema({ username: String, password: String }));

const insertUserIntoDatabase = async (requestBody) => {
  const { username, password } = requestBody;
  try {
    if (await doesUserExistAlready(username)) {
      console.log("用户已存在");
    } else {
      await insertUser(username, password);
      console.log("用户插入成功");
    }
  } catch (err) {
    console.error('操作失败:', err);
  }
};

const doesUserExistAlready = async (username) => {
  // await等待异步查询完成,拿到真实的文档结果
  const doc = await user.findOne({ username });
  // 文档不存在时返回null,此时返回false
  return doc !== null;
};

const insertUser = async (username, password) => {
  const newUserDoc = new user({ username, password });
  await newUserDoc.save();
};

其他可选方案(Promise链式调用)

如果不想用async/await,也可以用Promise链式调用实现:

const doesUserExistAlready = (username) => {
  return user.findOne({ username })
    .then(doc => doc !== null)
    .catch(err => {
      console.error('查询失败:', err);
      return false; // 可根据需求调整错误处理逻辑
    });
};

// 调用逻辑
const insertUserIntoDatabase = (requestBody) => {
  const { username, password } = requestBody;
  doesUserExistAlready(username)
    .then(exists => {
      if (exists) {
        console.log("用户已存在");
      } else {
        insertUser(username, password);
      }
    })
    .catch(err => console.error('操作失败:', err));
};

内容的提问来源于stack exchange,提问作者Deepeshkumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:04:04