クエリfindOneとexec()関数を含むMongooseコードに出くわしました。
JavaScriptでそのメソッドを見たことがありませんか?それは正確に何をしますか?
クエリfindOneとexec()関数を含むMongooseコードに出くわしました。
JavaScriptでそのメソッドを見たことがありませんか?それは正確に何をしますか?
回答:
基本的に、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の一部。
exec
メソッドを呼び出す必要があると思います。これは彼らが少なくともドキュメントで行うことです。確認するには、で自分自身を確認してくださいModel.find() instanceof require('bluebird')
。お役に立てれば。
Model.update().exec()
実行することを確認する必要があります。その後、更新を待たずにAPIに応答できます。
ダニエルはこれを非常に美しく答えました。クエリを作成して実行する方法の完全なリストを詳しく説明するには、次の使用例を見てください。
クエリ構築
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 +仕様では、then
Promiseに慣れているのと同じように機能する関数が必要です。
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
then
に、クエリでを使用してpromiseを返すこともできます。これはと大差ありませんexec
。私がこれが便利だと思うユースケースはのようなものを使うときですPromise.all
。によって返された約束exec
がそのような状況で機能するかどうかはわかりません。
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');