Answers:
基本上,当使用猫鼬时,可以使用助手来检索文档。每个接受查询条件的模型方法都可以通过callback
或exec
方法执行。
callback
:
User.findOne({ name: 'daniel' }, function (err, user) {
//
});
exec
:
User
.findOne({ name: 'daniel' })
.exec(function (err, user) {
//
});
因此,当您不传递回调时,可以构建查询并最终执行它。
您可以在猫鼬文档中找到其他信息。
更新
将Promises与Mongoose异步操作结合使用时,需要注意的一点是Mongoose查询不是 Promises。查询的确返回一个thenable,但是如果您需要一个真正的 Promise,则应使用该exec
方法。在这里可以找到更多信息。
在更新期间,我注意到我没有明确回答以下问题:
我以前从未在Javascript中看到过该方法吗?它到底是做什么的?
嗯,这不是本机JavaScript方法,而是Mongoose API的一部分。
exec
方法。至少这是他们在文档中所做的。确保可以使用进行检查Model.find() instanceof require('bluebird')
。希望这可以帮助。
Model.update().exec()
确保它将执行。然后,您可以响应api而无需等待更新。
丹尼尔回答得很漂亮。要详细说明构建和执行查询的方法,请查看以下用例:
查询大厦
猫鼬将不会执行查询,直到查询then
或被exec
调用。这在构建复杂查询时非常有用。一些示例可以包括使用populate
和aggregate
函数。
User.find({name: 'John'}) // Will not execute
通过回调执行
尽管由于其嵌套性质而被许多人所不喜欢,但可以通过提供可选的回调来执行查询。
User.find({name: 'John'}, (err, res) => {}) // Will execute
然后将API作为Promises / A +
猫鼬查询确实提供了一个then
功能。请勿将其与常规承诺相混淆。简而言之,Promises / A +规范需要一个then
功能来工作,就像我们习惯于诺言一样。
User.find({name: 'John'}).then(); // Will execute
Promise.all([User.find({name: 'John'}), User.find({name: 'Bob'})]) // Will execute all queries in parallel
exec功能
从猫鼬文档 If you need a fully-fledged promise, use the .exec() function.
User.find({name: 'John'}).exec(); // Will execute returning a promise
then
在查询中使用以返回承诺。这与没什么不同exec
。我发现使用方便的用例是使用Promise.all
。exec
虽然不确定在这种情况下返回的承诺是否有效。
exec()
如果没有提供回调,将返回promise。因此,以下模式非常方便且通用-它可以很好地处理回调或Promise:
function findAll(query, populate, cb) {
let q = Response.find(query);
if (populate && populate.length > 0) {
q = q.populate(populate);
}
// cb is optional, will return promise if cb == null
return q.lean().exec(cb);
}
我建议将Bluebird Promise与Mongoose一起使用,使用此调用:
const mongoose = require('mongoose');
mongoose.Promise = require('bluebird');