MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

क्वेरी के साथ प्रत्येक के लिए अंदर पुश करें ठीक से काम नहीं कर रहा है

यह एक अतुल्यकालिक मुद्दा है। आप कॉलबैक के अंदर सरणी के मान को पॉप्युलेट कर रहे हैं। लेकिन इवेंट लूप की प्रकृति के कारण, यह असंभव है कि console.log समय तक किसी भी कॉलबैक को कॉल किया जाएगा। निष्पादित किया जाता है।

आपने वादों से जुड़े समाधान का उल्लेख किया है, और शायद यह सही सौदा है। उदाहरण के लिए निम्न जैसा कुछ:

exports = function(orgLoc_id, data) {
  // ...
  let stream_ids = [];
  const promises = data.map(function(stream) {
    return streamsCollection.findOne({ _id: stream.stream_id }, { type: 1, sizes: 1 })
      .then(res => { //if I comment this query it will push without any problem
        if (res) {
          let newId = new BSON.ObjectId();
          // ...
          stream_ids.push(newId);
        }
      })
  })

  Promise.all(promises).then(function() {
    console.log('stream ids: ' + stream_ids);

    //TODO
    // any code that needs access to stream_ids should be in here...
  });
};

forEach . के परिवर्तन पर ध्यान दें map . के लिए ... इस तरह आपको सभी वादों की एक सरणी मिल रही है (मैं आपका findOne मान रहा हूं .then . की वजह से एक वादा वापस कर रहा है )।

फिर आप एक Promise.all . का उपयोग करते हैं सभी वादों को हल करने के लिए प्रतीक्षा करने के लिए, और फिर आपके पास अपनी सरणी होनी चाहिए।

साइड नोट:एक अधिक सुरुचिपूर्ण समाधान में newId returning को वापस करना शामिल होगा अपने .then . के अंदर . उस स्थिति में Promise.all वास्तव में सभी वादों के परिणामों की एक सरणी के साथ हल करेगा, जो कि newId के मान होंगे ।




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. खोल पर मोंगोडब क्वेरी आउटपुट में प्रारूप दिनांक

  2. बर्ट मोंगोडब परम

  3. कई क्षेत्रों द्वारा mongodb समूह मान

  4. नए ClusterControl को अपने MongoDB परिनियोजन को सुरक्षित करने दें

  5. सी # के साथ मोंगो डीबी - लेनदेन के बावजूद दस्तावेज़ जोड़ा गया