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

MongoDB Node.js मूल चालक चुपचाप `बल्कराइट` अपवाद निगल लेता है

तो टिप्पणी के रूप में, "यह एक बग है"। विशेष रूप से बग यहाँ है :

 // Return a Promise
  return new this.s.promiseLibrary(function(resolve, reject) {
    bulkWrite(self, operations, options, function(err, r) {
      if(err && r == null) return reject(err);
      resolve(r);
    });
  });

समस्या यह है कि "प्रतिक्रिया" (या r ) कॉलबैक में जिसे Promise . में लपेटा जा रहा है वास्तव में null नहीं है , और इसलिए त्रुटि मौजूद होने के बावजूद स्थिति true . नहीं है और reject(err) नहीं बुलाया जा रहा है, बल्कि resolve(r) भेजा जा रहा है और इसलिए इसे अपवाद नहीं माना जाता है।

सुधार के लिए कुछ ट्राइएज की आवश्यकता होगी, लेकिन आप writeErrors का निरीक्षण करके बताए गए अनुसार या तो 'काम कर सकते हैं' वर्तमान bulkWrite() . से प्रतिक्रिया में संपत्ति कार्यान्वयन या अन्य विकल्पों में से एक पर विचार करें:

बल्क एपीआई विधियों का सीधे उपयोग करना:

const MongoClient = require('mongodb').MongoClient,
      uri  = 'mongodb://localhost:27017/myNewDb';

(async () => {

  let db;

  try {

    db = await MongoClient.connect(uri);

    let bulk = db.collection('myNewCollection').initializeOrderedBulkOp();

    bulk.find({ foo: 'bar' }).upsert().updateOne({
      $setOnInsert: { count: 0 },
      $inc: { count: 0 }
    });

    let result = await bulk.execute();
    console.log(JSON.stringify(result,undefined,2));

  } catch(e) {
    console.error(e);
  } finally {
    db.close();
  }

})();

पूरी तरह से ठीक है लेकिन निश्चित रूप से इसके बजाय विरासत एपीआई विधियों का उपयोग करने के लिए बल्क एपीआई समर्थन के बिना सर्वर कार्यान्वयन पर स्वाभाविक रूप से वापस नहीं आने का मुद्दा है।

वादे को मैन्युअल रूप से लपेटना

(async () => {

  let db = await require('mongodb').MongoClient.connect('mongodb://localhost:27017/myNewDb');

  let mongoOps = [{
    updateOne: {
      filter: { foo: "bar" },
      update: {
        $setOnInsert: { count:0 },
        $inc: { count:1 },
      },
      upsert: true,
    }
  }];

  try {
    let result = await new Promise((resolve,reject) => {

      db.collection("myNewCollection").bulkWrite(mongoOps, (err,r) => {
        if (err) reject(err);
        resolve(r);
      });
    });
    console.log(JSON.stringify(result,undefined,2));
    console.log("Success!");
  } catch(e) {
    console.log("Failed:");
    console.log(e);
  }

})();

जैसा कि उल्लेख किया गया है कि समस्या bulkWrite() . के कार्यान्वयन के भीतर निहित है एक Promise के रूप में लौट रहा है . तो इसके बजाय आप callback() . के साथ कोड कर सकते हैं फ़ॉर्म बनाएं और अपना Promise करें आप जिस तरह से इसकी अपेक्षा करते हैं, उसके अनुसार कार्य करने के लिए लपेटना।

जैसा कि उल्लेख किया गया है, एक JIRA मुद्दे और ट्राइएज की आवश्यकता है जो अपवादों को संभालने का सही तरीका है। लेकिन उम्मीद है कि जल्द ही समाधान हो जाएगा। इस बीच, ऊपर से कोई तरीका चुनें।




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. कच्चे फ़ंक्शन में चर $ tid, $ id कैसे पास करें?

  2. डिफ़ॉल्ट रूप से MongoDB शेल में सुंदर प्रिंट

  3. MongoDB में धीमी क्वेरी से निपटना

  4. मोंगो डीबी सी # ड्राइवर - संग्रह में आईडी से कैसे जुड़ें?

  5. एक नेवला स्कीमा कैसे बनाएं जो इनपुट को mongodb में html के रूप में सहेजता है