2015-04-16 26 views
29

Bu soru this one benzer ancak terminoloji farklı olduğuna inanıyoruz. Mongoose 4'ten documentation:Gelincik 'statik' yöntemleri

Ayrıca, kendi özel belge örneği yöntemlerimizi de tanımlayabiliriz.

// 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); 
} 
Şimdi

eden hayvan örneklerinin hepsi

buna bir findSimilarTypes yöntemi mevcuttur.

Ve sonra: Bir Model statik yöntemleri ekleme

de basittir. Bizim animalSchema devam edersek: Statik yöntemlerle görünüyor

// 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); 
}); 

hayvan örneklerinin her yanı kendisine mevcut findByName yöntemi olurdu. Şemadaki statics ve methods nesneleri nelerdir? Fark nedir ve neden birini diğeriyle kullanayım?

cevap

38

statics Modeli tarif yöntemlerdir. Belgede (örnek) methods tanımlanmıştır.

Sen

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

yapabilir Ve sonra

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

Eğer Modeli veya yöntemi çağırmak için belgeyi kullanmak ister Yani sadece kullanım farkı yapmaya belge örneği fido kullanabilir? – Startec

+5

"Animals.findSimilarTypes" öğesini kullanamazsınız, çünkü "Animals" bir modeldir, "type" içermez. "FindSimilarTypes", "Hayvanlar" modelinde bulunmayan bir "this.type" dosyasına ihtiyaç duyuyor; modelde tanımlandığı gibi yalnızca bir doküman örneği bu özelliği içerecektir. findByName' fido' sadece *** bir *** belgedir '*** bütün *** belgeler üzerinden arama ve gerekir' Çünkü – laggingreflex

+2

Benzer şekilde 'fido.findByName' yapamaz. – laggingreflex