web-dev-qa-db-ja.com

MongooseのModel.findOne()とModel.findById()の違いは何ですか?

_id値に基づいてMongoDBからドキュメントを検索していると考えてください。次のコードのどれが効率的ですか?

  1. ModelObj.findById(IdValue).exec(callback);

  2. ModelObj.findOne({ '_id': IdValue}).exec(callback);

ModelObj.findById()は効率的だと思いますが、それを支持する理由は何ですか、またはどのように効率的ですか?

24
Amol M Kulkarni

findByIdは、表示するfindOne呼び出しとまったく同じ機能を持つ便利な関数です。

これが ソース です。

Model.findById = function findById (id, fields, options, callback) {
  return this.findOne({ _id: id }, fields, options, callback);
};
44
JohnnyHK

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);
};
5
Ronen Teva

findById(id)は、find({_ id:id})またはfindOne({_ id:id})の構文糖衣です

0
Prem