_id値に基づいてMongoDBからドキュメントを検索していると考えてください。次のコードのどれが効率的ですか?
ModelObj.findById(IdValue).exec(callback);
ModelObj.findOne({ '_id': IdValue}).exec(callback);
ModelObj.findById()は効率的だと思いますが、それを支持する理由は何ですか、またはどのように効率的ですか?
findById
は、表示するfindOne
呼び出しとまったく同じ機能を持つ便利な関数です。
これが ソース です。
Model.findById = function findById (id, fields, options, callback) {
return this.findOne({ _id: id }, fields, options, callback);
};
findById(id)
はfindOne({ _id: id })
とほぼ同等です。
ドキュメントの_idでクエリを実行する場合は、findById()
ではなくfindOne()
を使用します。
どちらの関数もfindOne()
をトリガーします。唯一の違いは、undefined
の扱い方です。findOne()
を使用すると、findOne(undefined)
およびfindOne({ _id: undefined })
がfindOne({})
と同等であり、任意のドキュメントを返すことがわかります。
ただし、mongooseはfindById(undefined)
をfindOne({ _id: null })
に変換します。
https://mongoosejs.com/docs/api.html#model_Model.findById を参照してください
これが source です。
Model.findById = function findById(id, projection, options, callback) {
if (typeof id === 'undefined') {
id = null;
}
if (callback) {
callback = this.$wrapCallback(callback);
}
return this.findOne({_id: id}, projection, options, callback);
};
findById(id)は、find({_ id:id})またはfindOne({_ id:id})の構文糖衣です