2015-04-16 16 views
29

Uważam, że to pytanie jest podobne do pytania this one, ale terminologia jest inna. Z Mongoose 4 documentation:Metody "statyczne" mongoozy a metody "instancji"

Możemy również zdefiniować nasze własne niestandardowe metody tworzenia dokumentów.

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

Teraz wszystkie nasze przypadkach zwierząt mają metoda findSimilarTypes dostępne do niego.

A potem:

Dodawanie metod statycznych do modelu również jest proste. Kontynuując naszą 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); 
}); 

Wydaje metodami statycznymi każdym z przypadków zwierząt miałoby metodę findByName dostępne do niego, jak również. Jakie obiekty w schemacie mają obiekty statics i methods? Jaka jest różnica i dlaczego miałbym używać jednej nad drugą?

Odpowiedz

38

są to metody zdefiniowane w Modelu. methods są zdefiniowane w dokumencie (instancji).

Można zrobić

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

A potem można użyć instancji dokumentu fido zrobić

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

Więc jedyną różnicą użycie jest czy używasz modelu lub dokument do wywołania metody? – Startec

+5

Nie można użyć 'Animals.findSimilarTypes', ponieważ' Animals' jest modelem, nie ma "typu". 'findSimilarTypes' potrzebuje' this.type', który nie istnieje w modelu 'Animals', tylko instancja dokumentu zawierałaby tę własność, zgodnie z definicją w modelu. – laggingreflex

+2

Podobnie nie można zrobić 'fido.findByName', ponieważ' findByName' będzie musiał przeszukać *** wszystkie *** dokumenty, a 'fido' jest tylko *** *** dokumentem. – laggingreflex