2015-04-16 14 views
29

मेरा मानना ​​है कि यह प्रश्न this one जैसा है लेकिन शब्दावली अलग है। मोंगोस 4 documentation से:मोंगोस 'स्थैतिक' विधियों बनाम 'उदाहरण' विधियों

हम भी अपने स्वयं के कस्टम दस्तावेज़ उदाहरण विधियों को परिभाषित कर सकते हैं।

// 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 विधि यह करने के लिए उपलब्ध के साथ-साथ होगा। स्कीमा में statics और methods ऑब्जेक्ट्स क्या हैं? अंतर क्या है और मैं दूसरे पर एक का उपयोग क्यों करूं?

उत्तर

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' का उपयोग नहीं कर सकते क्योंकि 'पशु' एक मॉडल है, इसमें कोई "प्रकार" नहीं है। 'findSimilarTypes' को 'this.type' की आवश्यकता होती है जो 'पशु' मॉडल में मौजूद नहीं होगी, मॉडल में परिभाषित अनुसार केवल एक दस्तावेज़ उदाहरण में उस संपत्ति को शामिल किया जाएगा। – laggingreflex

+2

इसी प्रकार आप 'fido.findByName' नहीं कर सकते हैं क्योंकि' findByName' को *** *** *** **** *** ***** ************************************************************************** – laggingreflex

संबंधित मुद्दे