29
我相信這個問題類似於this one,但術語是不同的。來自Mongoose 4 documentation:Mongoose'靜態'方法與'實例'方法
我們也可以定義我們自己的自定義文檔實例方法。
// 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
方法爲好。 Schema中的statics
和methods
對象是什麼?有什麼區別,爲什麼我會用另一個呢?
所以,唯一的用法區別是你是否使用模型或調用的方法的文檔? – Startec
你不能使用'Animals.findSimilarTypes'因爲'Animals'是一個模型,它沒有「type」。 'findSimilarTypes'需要一個'this.type',它不會存在於'Animals'模型中,只有一個文檔實例會包含該屬性,正如模型中定義的那樣。 – laggingreflex
同樣,你不能做'fido.findByName',因爲'findByName'需要搜索***所有***文檔和'fido'只是*** ***文檔。 – laggingreflex