Mongoose中Document和Query的区别及findOne返回值矛盾疑问
Mongoose中findOne返回值表述差异解释
这两处官方表述不存在矛盾,分别对应不同的调用场景:
- 调用
Model.findOne()等静态CRUD方法时,若未传入回调函数、也没有用await等待执行,方法直接返回的是 Mongoose Query 对象。Query对象支持链式调用追加查询条件(比如.sort()、.where()等),此时还未真正向MongoDB发起查询请求。 - 当你为方法传入回调函数,或者用
await等待Query执行时,会触发真正的数据库查询,最终得到的返回结果就是 Mongoose Document 实例(无匹配数据时返回null),这是因为Mongoose的Query对象是符合Promise规范的thenable对象,await时会自动执行查询并返回解析后的文档结果。
可参考以下代码示例验证:
const mongoose = require('mongoose'); const TestModel = mongoose.model('Test', new mongoose.Schema({ name: String })); // 场景1:直接调用,返回Query对象 const query = TestModel.findOne({ name: '测试数据' }); console.log(query instanceof mongoose.Query); // 输出 true // 场景2:await调用,得到Document实例 const doc = await TestModel.findOne({ name: '测试数据' }); console.log(doc instanceof mongoose.Document); // 查询有匹配时输出 true // 场景3:传入回调,回调参数拿到Document实例 TestModel.findOne({ name: '测试数据' }, (err, result) => { console.log(result instanceof mongoose.Document); // 查询有匹配时输出 true });
内容的提问来源于stack exchange,提问作者falah mahmood
相关产品推荐
相关产品推荐

