如何使用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
相关产品推荐
相关产品推荐

