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

नेवला डुप्लीकेट कुंजी त्रुटि upsert के साथ

एक अप्सर्ट जिसके परिणामस्वरूप दस्तावेज़ सम्मिलित होता है वह पूरी तरह से परमाणु संचालन नहीं है। अप्सर्ट को निम्न असतत चरणों का पालन करने वाले के रूप में सोचें:

  1. पहचाने गए दस्तावेज़ को ऊपर करने के लिए क्वेरी करें।
  2. यदि दस्तावेज़ मौजूद है, तो मौजूदा दस्तावेज़ को परमाणु रूप से अपडेट करें।
  3. अन्यथा (दस्तावेज़ मौजूद नहीं है), परमाणु रूप से एक नया दस्तावेज़ डालें जिसमें क्वेरी फ़ील्ड और अपडेट शामिल हों।

तो चरण 2 और 3 प्रत्येक परमाणु हैं, लेकिन चरण 1 के बाद एक और अप्सर्ट हो सकता है, इसलिए आपके कोड को डुप्लिकेट कुंजी त्रुटि की जांच करने की आवश्यकता है और यदि ऐसा होता है तो अप्सर्ट को पुनः प्रयास करें। उस समय आप उस _id वाले दस्तावेज़ को जानते हैं मौजूद है इसलिए यह हमेशा सफल रहेगा।

उदाहरण के लिए:

var minute = utils.minute();
Monitor.update({ _id: minute }, { $inc: update }, { upsert: true }, function(err) {
    if (err) {
        if (err.code === 11000) {
            // Another upsert occurred during the upsert, try again. You could omit the
            // upsert option here if you don't ever delete docs while this is running.
            Monitor.update({ _id: minute }, { $inc: update }, { upsert: true },
                function(err) {
                    if (err) {
                        console.trace(err);
                    }
                });
        }
        else {
            console.trace(err);
        }
    }
});

संबंधित दस्तावेज़ीकरण के लिए यहां देखें।

आप अभी भी सोच रहे होंगे कि ऐसा क्यों हो सकता है यदि सम्मिलन परमाणु है, लेकिन इसका मतलब यह है कि सम्मिलित दस्तावेज़ पर तब तक कोई अपडेट नहीं होगा जब तक कि यह पूरी तरह से लिखा न जाए, ऐसा नहीं है कि समान _id हो सकता है।

साथ ही, आपको _id . पर मैन्युअल रूप से एक अनुक्रमणिका बनाने की आवश्यकता नहीं है चूंकि सभी MongoDB संग्रहों में _id . पर एक अद्वितीय अनुक्रमणिका होती है ध्यान दिए बिना। तो आप इस लाइन को हटा सकते हैं:

monitorSchema.index({_id: -1}); // Not needed



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. किसी सरणी में पहले आइटम में मिलान करने के लिए MongoDB को क्वेरी करना

  2. मुझे मोंगोडीबी की वस्तु को केवल फ़िल्टर किए गए सरणी आइटम के साथ पुनर्प्राप्त करने की आवश्यकता है

  3. Mongodb - Mongoimport त्रुटि अमान्य वर्ण

  4. क्या MongoDB में हाल ही में हटाए गए दस्तावेज़ों को पुनर्प्राप्त करने का कोई तरीका है?

  5. MongoDB पेजिनेशन के लिए रेंज क्वेरी