2012-12-06 8 views
5

यहां मैं जो करने की कोशिश कर रहा हूं वह यहां है।क्या क्वेरी बिल्डर के साथ मोंगोस मिडलवेयर का उपयोग करने का कोई तरीका है?

मैं एक विश्वसनीय वातावरण में मोंगोज़ोज़ का उपयोग कर रहा हूं (उर्फ जो पारित होता है उसे हमेशा सुरक्षित/प्रचलित माना जाता है) और मुझे इसे चलाने के लिए संभावित रूप से "चयन" और "पॉप्युलेट" सामान पास करने की आवश्यकता है। मैं इसे हर अनुरोध के लिए लगातार तरीके से प्राप्त कर रहा हूं। मैं इस तरह कुछ करना चाहता हूँ:

var paramObject = sentFromUpAbove; // sent down on every Express request 
var query = {...} 
Model.myFind(query, paramObject).exec(function(err, data) {...}); 

समारोह मैं मिडलवेयर या अन्य निर्माण को मिलेगा, सरल है बस:

function(query, paramObject) { 
    return this.find(query) 
    .populate(paramObject.populate) 
    .select(paramObject.select); 
} 

और एक findOne के लिए एक ही। मुझे पता है कि मोंगोस को सीधे बढ़ाकर इसे कैसे किया जाए, लेकिन यह गंदा लगता है। मैं बजाय मिडलवेयर या कुछ अन्य निर्माण का उपयोग करता हूं जो इसे स्वच्छ और कुछ हद तक भविष्य के सबूत तरीके से करता है।

मुझे पता है कि मैं इसे मॉडल के आधार पर मॉडल पर स्टेटिक्स के माध्यम से पूरा कर सकता हूं, लेकिन मैं इसे हर मॉडल पर सार्वभौमिक रूप से करना चाहता हूं। कोई सलाह?

+0

तो जाहिरा तौर पर, प्रोटोटाइप को जोड़ने तरीका यह है है। गंदा या नहीं मुझे लगता है कि इसमें गोता लगाने का समय है। –

उत्तर

0

आप this के लिए इसी तरह कुछ कर सकते हैं, लेकिन दुर्भाग्य से खोजने के संचालन pre और post कॉल नहीं करते तो वे मिडलवेयर को छोड़ दें।

0

आप एक सरल नेवला plugin है कि किसी भी स्कीमा आप इसे लागू करना चाहते हैं myFind और myFindOne कार्यों कहते हैं बनाकर ऐसा कर सकते हैं:

// Create the plugin function as a local var, but you'd typically put this in 
// its own file and require it so it can be easily shared. 
var selectPopulatePlugin = function(schema, options) { 
    // Generically add the desired static functions to the schema. 
    schema.statics.myFind = function(query, paramObject) { 
     return this.find(query) 
      .populate(paramObject.populate) 
      .select(paramObject.select); 
    }; 
    schema.statics.myFindOne = function(query, paramObject) { 
     return this.findOne(query) 
      .populate(paramObject.populate) 
      .select(paramObject.select); 
    }; 
}; 

// Define the schema as you normally would and then apply the plugin to it. 
var mySchema = new Schema({...}); 
mySchema.plugin(selectPopulatePlugin); 
// Create the model as normal. 
var MyModel = mongoose.model('MyModel', mySchema); 

// myFind and myFindOne are now available on the model via the plugin. 
var paramObject = sentFromUpAbove; // sent down on every Express request 
var query = {...} 
MyModel.myFind(query, paramObject).exec(function(err, data) {...});