【问题标题】: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)

【问题讨论】:

标签: node.js mongodb mongoose


【解决方案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 对象) .
    猜你喜欢
    • 1970-01-01
    • 2017-03-19
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 2016-08-30
    相关资源
    最近更新 更多