クエリfindOneとexec()関数を含むMongooseコードに出会いました。
Javascriptでそのメソッドを見たことがありませんか?それは正確に何をしますか?
基本的に、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の一部です。
ダニエルは非常に美しく答えました。クエリを構築および実行する方法の完全なリストについて詳しく説明するには、次の使用例を見てください。
クエリの作成
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
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');