マングース-exec関数は何をしますか?


100

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

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

回答:


143

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

callback

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

exec

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

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

あなたはマングースのドキュメントで追加情報を見つけることができます。

更新

使用してノートに何か約束をマングースの非同期操作との組み合わせでは、マングースのクエリがあるということであるではない約束。クエリはthenableを返しますが、実際の Promiseが必要な場合はexecメソッドを使用する必要があります。詳細については、こちらをご覧ください

アップデート中に、私は質問に明確に答えていないことに気付きました:

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

まあそれはだないネイティブJavaScriptの方法が、マングースAPIの一部。


4
mongoose.Promise = require( 'bluebird')を設定した場合でも、.exec()を使用する必要がありますか?ありがとう。
wayofthefuture 2017年

4
@wayofthefuture私はドキュメントがこの問題について本当に混乱していると思いますが、それでもexecメソッドを呼び出す必要があると思います。これは彼らが少なくともドキュメントで行うことです。確認するには、で自分自身を確認してくださいModel.find() instanceof require('bluebird')。お役に立てれば。
danillouz 2017年

1
そして、deleteやinsertManyなどの他の操作の問題があります...これらの場合、exec()が必要でしょうか?削除では、
内部で

1
コールバックが渡されない場合幹部も、私は言わなければならない非常に便利である、約束を返します
アレクサンダー・ミルズ

それは誰かを救うかもしれません。Model.update()が機能し、それほど重要ではないデータが更新されてAPIに応答が返されるのを待たない場合。更新は実行されません。Model.update().exec()実行することを確認する必要があります。その後、更新を待たずにAPIに応答できます。
Yogesh

48

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

クエリ構築

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

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

コールバックによる実行

ネストの性質上、多くの人には好まれませんが、オプションのコールバックを提供することでクエリを実行できます。

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

次に、Promises / A +としてのAPI

Mongooseクエリはthen機能を提供します。これを通常の約束と混同しないでください。簡単に言えば、Promises / A +仕様では、thenPromiseに慣れているのと同じように機能する関数が必要です。

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

1
ドキュメントでは明示的に言及していませんが、例ではUser.save()がpromiseを返すことも示しています。exec()およびsave()以外に、モデルの他のマングースメソッドはpromiseを返しますか、それともこれら2つだけですか?
thetrystero 2017

上記で指摘したようthenに、クエリでを使用してpromiseを返すこともできます。これはと大差ありませんexec。私がこれが便利だと思うユースケースはのようなものを使うときですPromise.all。によって返された約束execがそのような状況で機能するかどうかはわかりません。
Anshul Koka

[解答を承認]
コーディ

.exec()で完全な例を追加できますか?@AnshulKoka .exec()が自動的にクエリを非同期にするのですか、それとも非同期/
待機を

クエリを非同期にするにはasync / awaitが必要になるため、質問を理解しているかどうかはわかりません。完全な例のリクエストについては、私の例の前に単に接頭辞を付けてください。
Anshul Koka

7

exec()コールバックが提供されない場合、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);

}

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

const mongoose = require('mongoose');
mongoose.Promise = require('bluebird');

なぜブルーバードが必要なのですか?exec()がある場合
Indraraj26
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.