Mongoose - निष्पादन कार्य क्या करता है?


101

मैं मानगो कोड के एक टुकड़े पर आया था जिसमें एक क्वेरी findOne और फिर एक निष्पादन () फ़ंक्शन शामिल था।

मैंने पहले कभी जावास्क्रिप्ट में वह तरीका नहीं देखा? यह वास्तव में क्या करता है?

जवाबों:


146

मूल रूप से मानस का उपयोग करते समय, सहायकों का उपयोग करके दस्तावेजों को पुनर्प्राप्त किया जा सकता है। प्रत्येक मॉडल विधि जो क्वेरी की शर्तों को स्वीकार करती है 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 विधि है, लेकिन नेवला एपीआई का हिस्सा है।


4
क्या होगा अगर मैंने mongoose.Promise सेट किया है। धन्यवाद।
रास्ता मचान

4
@wayofthefuture मुझे लगता है कि डॉक्स वास्तव में इस मामले में भ्रमित हैं, लेकिन मेरा मानना ​​है कि आपको अभी भी execविधि को कॉल करने की आवश्यकता है । यह वही है जो वे डॉक्स में कम से कम करते हैं। यह सुनिश्चित करने के लिए कि आप स्वयं की जाँच कर सकते हैं Model.find() instanceof require('bluebird')। उम्मीद है की यह मदद करेगा।
डैनिलियोज

1
और फिर डिलीट और इन्सर्ट जैसे अन्य ऑपरेशन का सवाल है ... इन मामलों में निष्पादन () आवश्यक होगा? हटाएं हुड के नीचे किसी प्रकार के क्वेरी का उपयोग करना होगा ...
20

1
निष्पादन भी एक वादा देता है, यदि कोई कॉलबैक पारित नहीं किया जाता है, जो बहुत सुविधाजनक है, तो मुझे कहना होगा
अलेक्जेंडर मिल्स

यह किसी को बचा सकता है । यदि आपको लगता है कि Model.update () अपना काम करेगा और कुछ महत्वपूर्ण-तो-महत्वपूर्ण डेटा के अपडेट होने और एपीआई पर प्रतिक्रिया के लिए प्रतीक्षा न करें; आपका अपडेट निष्पादित नहीं होगा। आपको Model.update().exec()यह सुनिश्चित करने की आवश्यकता है कि यह निष्पादित होगा। फिर आप अपडेट की प्रतीक्षा किए बिना आपी को जवाब दे सकते हैं।
योगेश

49

डेनियल ने इसका जवाब काफी खूबसूरती से दिया है। प्रश्नों को बनाने और निष्पादित करने के तरीकों की विस्तृत सूची पर विस्तृत करने के लिए, निम्नलिखित उपयोग मामलों को देखें:

क्वेरी बिल्डिंग

Mongoose किसी क्वेरी को तब तक निष्पादित नहीं करेगा, जब तक उस पर कॉल thenexecकिया गया हो। जटिल प्रश्नों का निर्माण करते समय यह बहुत उपयोगी है। कुछ उदाहरणों में कार्यों 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

1
डॉक्स ने स्पष्ट रूप से इसका उल्लेख नहीं किया, लेकिन उदाहरण उपयोगकर्ता को दिखाते हैं। निष्पादन के अलावा () और बचाओ () मॉडल पर किसी भी अन्य सामान्य तरीकों का वादा करते हैं, या यह सिर्फ इन दो है?
Thetrystero

जैसा कि ऊपर बताया गया है, आप thenएक वादा वापस करने के लिए क्वेरी पर भी उपयोग कर सकते हैं । यह बहुत अलग नहीं है exec। उपयोग मामला मुझे यह आसान लगता है जब कुछ का उपयोग कर रहा है Promise.all। यकीन नहीं है कि अगर वादा execऐसे संदर्भों में काम करता है, तो वापस आ गया ।
अंशुल कोका

[स्वीकार किए जाते हैं]
कोड़ी

क्या आप .exec () के साथ एक पूर्ण उदाहरण जोड़ सकते हैं? @AnshulKoka यह है कि .exec () स्वचालित रूप से क्वेरी को अतुल्यकालिक बनाता है या क्या मुझे async / प्रतीक्षा शामिल करनी चाहिए
O'Dane Brissett

क्वेरी को अतुल्यकालिक बनाने के लिए async / प्रतीक्षा की आवश्यकता होगी इसलिए मुझे यकीन नहीं है कि अगर मैं प्रश्न को समझूं। बस उपसर्ग आपके उदाहरण के लिए एक पूर्ण उदाहरण के लिए मेरे अनुरोध का इंतजार कर रहा है।
अंशुल कोका

8

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');

हमें ब्लूबर्ड की आवश्यकता क्यों है? जब हमने निष्पादन किया है ()
इंद्रराज २६
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.