Mongooseのメソッドと静的関数の使用とは何ですか?通常の関数とはどう違いますか?
誰でも例との違いを説明できますか。
データベースロジックは、データモデル内にカプセル化する必要があります。 Mongooseには、メソッドと静的の2つの方法があります。 Methodsはドキュメントにインスタンスメソッドを追加しますが、Staticsはモデル自体に静的な「クラス」メソッドを追加します。
例が与えられた場合動物以下のモデル:
var AnimalSchema = mongoose.Schema({
name: String,
type: String,
hasTail: Boolean
});
module.exports = mongoose.model('Animal', AnimalSchema);
同様のタイプの動物を見つけるメソッドと、尾を持つすべての動物を見つける静的メソッドを追加できます。
AnimalSchema.methods.findByType = function (cb) {
return this.model('Animal').find({ type: this.type }, cb);
};
AnimalSchema.statics.findAnimalsWithATail = function (cb) {
Animal.find({ hasTail: true }, cb);
};
メソッドと静的関数の使用例を含む完全なモデルを次に示します。
var AnimalSchema = mongoose.Schema({
name: String,
type: String,
hasTail: Boolean
});
AnimalSchema.methods.findByType = function (cb) {
return this.model('Animal').find({ type: this.type }, cb);
};
AnimalSchema.statics.findAnimalsWithATail = function (cb) {
Animal.find({ hasTail: true }, cb);
};
module.exports = mongoose.model('Animal', AnimalSchema);
// example usage:
var dog = new Animal({
name: 'Snoopy',
type: 'dog',
hasTail: true
});
dog.findByType(function (err, dogs) {
console.log(dogs);
});
Animal.findAnimalsWithATail(function (animals) {
console.log(animals);
});
hasTail
で動物を取得したい場合は、次のコード行を変更するだけです。
return this.model('Animal').find({ type: this.type }, cb);
に:
return this.model('Animal').find({ hasTail: true }, cb);
そして、静的関数を作成する必要はありません。
トークンの追加など、個々のドキュメントを操作する場合は、個々のドキュメントでメソッドを使用します。コレクション全体をクエリする場合は、静的アプローチを使用します。