Mongoose - find(,cb) 和 find().exec(cb) 有啥区别?
Posted
技术标签:
【中文标题】Mongoose - find(,cb) 和 find().exec(cb) 有啥区别?【英文标题】:Mongoose - Whats the difference between find(,cb) and find().exec(cb)?Mongoose - find(,cb) 和 find().exec(cb) 有什么区别? 【发布时间】:2016-05-20 22:18:34 【问题描述】:我找到了两种使用 mongoose find()
执行查询的方法,但想知道它们是否不同:
我们应该什么时候使用:
Model.find(,cb)
我们应该什么时候使用:
Model.find().exec(cb)
【问题讨论】:
Mongoose - What does the exec function do?的可能重复 知道了,所以基本上如果我不链接查询它没有意义? 【参考方案1】:都执行查询,然后运行回调。
主要区别在于第一个返回一个Query
对象,而第二个返回一个Promise
,如果你需要promise,这很有用。
const query = Model.find(, cb);
然后您可以使用query
变量。
虽然承诺...
const promise = Model.find().exec();
然后你可以使用 Promise 并执行以下操作:
promise.then(cb);
promise.catch((err) =>
console.error(err);
);
但是如果你这样做 Model.find().exec(cb);
回调也会被调用而不使用承诺......
希望对你有帮助
【讨论】:
【参考方案2】:不同之处在于第一个执行查询并调用您的回调。而在第二个省略回调的地方,查询将不会被执行。相反,它将返回一个 Query
对象,该对象可用于链接方法、指定搜索词和光标选项等...
http://mongoosejs.com/docs/2.7.x/docs/query.html
如果您不需要做任何类型的链接,或者对底层 Cursor 进行任何其他操作,那么只需使用第一种方法。
但第二种方法可能有助于执行以下操作:
findCars : function(options, callback)
var query = Model.find();
if(options.limit) query.limit(options.limit);
if(options.skip) query.limit(options.skip);
if(options.populate) query.populate(options.populate);
return query.exec(callback);
【讨论】:
.exec()
返回 a promise,而不是 Query
对象(但是,当您的代码正确显示时,Model.find()
确实返回 Query
对象) .以上是关于Mongoose - find(,cb) 和 find().exec(cb) 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
find(...).populate 不是 mongoose 中的函数