web-dev-qa-db-ja.com

Mongoose-exec関数は何をしますか?

クエリfindOneとexec()関数を含むMongooseコードに出会いました。

Javascriptでそのメソッドを見たことがありませんか?それは正確に何をしますか?

73
user439133

基本的に、mongooseを使用する場合、ヘルパーを使用してドキュメントを取得できます。クエリ条件を受け入れるすべてのモデルメソッドは、callbackまたはexecメソッドを使用して実行できます。

callback

User.findOne({ name: 'daniel' }, function (err, user) {
  //
});

exec

User
  .findOne({ name: 'daniel' })
  .exec(function (err, user) {
      //
  });

したがって、コールバックを渡さない場合、クエリを作成して最終的に実行できます。

追加情報は mongoose docs にあります。

UPDATE

Promises をMongoose非同期操作と組み合わせて使用​​する場合の注意点は、MongooseクエリがnotPromisesであることです。クエリはthenableを返しますが、realPromiseが必要な場合は、execメソッドを使用する必要があります。詳細については、 こちら をご覧ください。

更新中に、質問に明示的に答えていないことに気付きました。

Javascriptでそのメソッドを見たことがありませんか?それは正確に何をしますか?

まあそれはではなくネイティブJavaScriptメソッドですが、Mongoose APIの一部です。

100
danillouz

ダニエルは非常に美しく答えました。クエリを構築および実行する方法の完全なリストについて詳しく説明するには、次の使用例を見てください。

クエリの作成

Mongooseは、thenまたはexecが呼び出されるまでクエリを実行しません。これは、複雑なクエリを作成するときに非常に便利です。いくつかの例には、populateおよびaggregate関数の使用が含まれます。

User.find({name: 'John'}) // Will not execute

コールバックによる実行

ネストの性質により多くの人に嫌われていますが、オプションのコールバックを提供することでクエリを実行できます。

User.find({name: 'John'}, (err, res) => {}) // Will execute

その後、約束としてのAPI/A +

Mongooseクエリは、then関数を提供します。これは通常の約束と混同しないでください。簡単に言えば、Promises/A +仕様では、Promiseで慣れ親しんでいるように機能する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関数

MongooseドキュメントからIf you need a fully-fledged promise, use the .exec() function.

User.find({name: 'John'}).exec(); // Will execute returning a promise
30
Anshul Koka

exec()は、コールバックが提供されない場合にプロミスを返します。したがって、次のパターンは非常に便利で汎用的です。コールバックまたはプロミスをうまく処理できます。

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);

}

MongooseでBluebird Promiseを使用することをお勧めします。これを行うには、次の呼び出しを使用します。

const mongoose = require('mongoose');
mongoose.Promise = require('bluebird');
6
Alexander Mills