मैं मानगो कोड के एक टुकड़े पर आया था जिसमें एक क्वेरी findOne और फिर एक निष्पादन () फ़ंक्शन शामिल था।
मैंने पहले कभी जावास्क्रिप्ट में वह तरीका नहीं देखा? यह वास्तव में क्या करता है?
मैं मानगो कोड के एक टुकड़े पर आया था जिसमें एक क्वेरी findOne और फिर एक निष्पादन () फ़ंक्शन शामिल था।
मैंने पहले कभी जावास्क्रिप्ट में वह तरीका नहीं देखा? यह वास्तव में क्या करता है?
जवाबों:
मूल रूप से मानस का उपयोग करते समय, सहायकों का उपयोग करके दस्तावेजों को पुनर्प्राप्त किया जा सकता है। प्रत्येक मॉडल विधि जो क्वेरी की शर्तों को स्वीकार करती है callback
या exec
विधि के माध्यम से निष्पादित की जा सकती है ।
callback
:
User.findOne({ name: 'daniel' }, function (err, user) {
//
});
exec
:
User
.findOne({ name: 'daniel' })
.exec(function (err, user) {
//
});
इसलिए जब आप कॉलबैक पास नहीं करते हैं तो आप एक क्वेरी बना सकते हैं और अंततः इसे निष्पादित कर सकते हैं।
आप मोंगोज़ डॉक्स में अतिरिक्त जानकारी पा सकते हैं ।
अपडेट करें
Mongoose async संचालन के संयोजन में Promises का उपयोग करते समय कुछ ध्यान दें कि Mongoose प्रश्न वादा नहीं है । प्रश्न वापस करने योग्य हैं , लेकिन यदि आपको एक वास्तविक वादा चाहिए तो आपको exec
विधि का उपयोग करना चाहिए । अधिक जानकारी यहां पाई जा सकती है ।
अद्यतन के दौरान मैंने देखा कि मैंने स्पष्ट रूप से इस सवाल का जवाब नहीं दिया:
मैंने पहले कभी जावास्क्रिप्ट में वह तरीका नहीं देखा? यह वास्तव में क्या करता है?
खैर यह नहीं एक देशी JavaScript विधि है, लेकिन नेवला एपीआई का हिस्सा है।
exec
विधि को कॉल करने की आवश्यकता है । यह वही है जो वे डॉक्स में कम से कम करते हैं। यह सुनिश्चित करने के लिए कि आप स्वयं की जाँच कर सकते हैं Model.find() instanceof require('bluebird')
। उम्मीद है की यह मदद करेगा।
Model.update().exec()
यह सुनिश्चित करने की आवश्यकता है कि यह निष्पादित होगा। फिर आप अपडेट की प्रतीक्षा किए बिना आपी को जवाब दे सकते हैं।
डेनियल ने इसका जवाब काफी खूबसूरती से दिया है। प्रश्नों को बनाने और निष्पादित करने के तरीकों की विस्तृत सूची पर विस्तृत करने के लिए, निम्नलिखित उपयोग मामलों को देखें:
क्वेरी बिल्डिंग
Mongoose किसी क्वेरी को तब तक निष्पादित नहीं करेगा, जब तक उस पर कॉल then
न exec
किया गया हो। जटिल प्रश्नों का निर्माण करते समय यह बहुत उपयोगी है। कुछ उदाहरणों में कार्यों populate
और aggregate
कार्यों का उपयोग करना शामिल हो सकता है।
User.find({name: 'John'}) // Will not execute
कॉलबैक के माध्यम से निष्पादन
हालाँकि, इसके घोंसले के शिकार प्रकृति के कारण कई लोगों को नापसंद है, लेकिन वैकल्पिक कॉलबैक प्रदान करके प्रश्नों को निष्पादित किया जा सकता है।
User.find({name: 'John'}, (err, res) => {}) // Will execute
तब एपीआई एक वादा / ए + के रूप में
Mongoose क्वेरीज़ एक then
फ़ंक्शन प्रदान करती है। यह नियमित वादों के साथ भ्रमित नहीं होना है। सीधे शब्दों में कहें, वादे / ए + विनिर्देशन को then
काम करने के लिए एक फ़ंक्शन की आवश्यकता होती है जैसे हम वादों के साथ कैसे उपयोग किए जाते हैं।
User.find({name: 'John'}).then(); // Will execute
Promise.all([User.find({name: 'John'}), User.find({name: 'Bob'})]) // Will execute all queries in parallel
निष्पादन समारोह
Mongoose डॉक्स से If you need a fully-fledged promise, use the .exec() function.
User.find({name: 'John'}).exec(); // Will execute returning a promise
then
एक वादा वापस करने के लिए क्वेरी पर भी उपयोग कर सकते हैं । यह बहुत अलग नहीं है exec
। उपयोग मामला मुझे यह आसान लगता है जब कुछ का उपयोग कर रहा है Promise.all
। यकीन नहीं है कि अगर वादा exec
ऐसे संदर्भों में काम करता है, तो वापस आ गया ।
exec()
अगर कोई कॉलबैक प्रदान नहीं किया जाता है तो एक वादा वापस करेगा। तो निम्न पैटर्न बहुत सुविधाजनक और सामान्य है - यह कॉलबैक या वादों को अच्छी तरह से संभाल सकता है:
function findAll(query, populate, cb) {
let q = Response.find(query);
if (populate && populate.length > 0) {
q = q.populate(populate);
}
// cb is optional, will return promise if cb == null
return q.lean().exec(cb);
}
मैं माननीयों के साथ ब्लूबर्ड वादों का उपयोग करने की सलाह देता हूं, ऐसा करने के लिए, इस कॉल का उपयोग करें:
const mongoose = require('mongoose');
mongoose.Promise = require('bluebird');