2015-04-16 191 views
29

我相信這個問題類似於this one,但術語是不同的。來自Mongoose 4 documentationMongoose'靜態'方法與'實例'方法

我們也可以定義我們自己的自定義文檔實例方法。

// 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中的staticsmethods對象是什麼?有什麼區別,爲什麼我會用另一個呢?

回答

38

statics是模型上定義的方法。在文檔(實例)上定義了methods

你可能會做

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

然後你可以使用文檔實例fido

fido.findSimilarTypes(function(err, dogs){ 
    // dogs => [ {name:'fido',type:'dog} , {name:'sheeba',type:'dog'} ] 
}); 
+0

所以,唯一的用法區別是你是否使用模型或調用的方法的文檔? – Startec

+5

你不能使用'Animals.findSimilarTypes'因爲'Animals'是一個模型,它沒有「type」。 'findSimilarTypes'需要一個'this.type',它不會存在於'Animals'模型中,只有一個文檔實例會包含該屬性,正如模型中定義的那樣。 – laggingreflex

+2

同樣,你不能做'fido.findByName',因爲'findByName'需要搜索***所有***文檔和'fido'只是*** ***文檔。 – laggingreflex