1. ホーム
  2. node.js

Mongoose の「静的」メソッドと「インスタンス」メソッドの比較

2023-09-07 10:16:11

疑問点

この質問は、次のようなものだと思います。 この1 と似ていますが、用語が違います。マングース4号より ドキュメント :

また、独自のドキュメントインスタンスメソッドも定義することができます。

// define a schema
var animalSchema = new Schema({ name: String, type: String });

// assign a function to the "methods" object of our animalSchema
animalSchema.methods.findSimilarTypes = function (cb) {
  return this.model('Animal').find({ type: this.type }, cb);
}

<ブロッククオート

これですべての動物インスタンスにfindSimilarTypesメソッドが利用できるようになりました。

そして

<ブロッククオート

モデルに静的メソッドを追加するのも簡単です。私たちのanimalSchemaの続きです。

// assign a function to the "statics" object of our animalSchema
animalSchema.statics.findByName = function (name, cb) {
  return this.find({ name: new RegExp(name, 'i') }, cb);
}

var Animal = mongoose.model('Animal', animalSchema);
Animal.findByName('fido', function (err, animals) {
  console.log(animals);
});

静的メソッドでは、それぞれの動物のインスタンスに findByName メソッドも利用できるようです。 その staticsmethods オブジェクトを使用できますか?また、なぜどちらかを使用するのでしょうか?

どのように解決するのですか?

statics はモデルで定義されたメソッドです。 methods はドキュメント(インスタンス)に対して定義されたものです。

を使うことがあります。 静的 のようなメソッドを使うかもしれません。 Animal.findByName :

const fido = await Animal.findByName('fido');
// fido => { name: 'fido', type: 'dog' }

また、インスタンス メソッド のように fido.findSimilarTypes :

const dogs = await fido.findSimilarTypes();
// dogs => [ {name:'fido',type:'dog} , {name:'sheeba',type:'dog'} ]

しかし、あなたは Animals.findSimilarTypes() というのは、Animalsはモデルであり、"type"を持たないからです。 findSimilarTypes を必要とします。 this.type を必要とします。これはアニメーションのモデルには存在せず、ドキュメントインスタンスのみがモデルで定義されたそのプロパティを含むでしょう。

同様に、あなたは fido.findByName なぜなら findByName はすべてのドキュメントを検索する必要があり fido は単に a のドキュメントを参照してください。

¹まあ、技術的には ができます。 というのも、インスタンスはコレクションにアクセスすることができるからです ( this.constructor または this.model('Animal') のように、インスタンスのプロパティを使用しないインスタンスメソッドを持つことは(少なくともこのケースでは)意味がないでしょう。(おかげさまで に感謝します。 に感謝します)。