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

अद्वितीय कुंजी जोड़ने के बाद भी MongoDB डुप्लिकेट दस्तावेज़

बधाई हो, ऐसा लगता है कि आपको एक बग मिल गया है। यह केवल मेरे परीक्षण में MongoDB 3.0.0 के साथ होता है, या कम से कम MongoDB 2.6.6 पर मौजूद नहीं है। बग अब SERVER-17599 . पर रिकॉर्ड किया गया

<ब्लॉकक्वॉट>

नोट :वास्तव में एक "मुद्दा" नहीं है लेकिन "डिज़ाइन द्वारा" पुष्टि की गई है। संस्करण 3.0.0 के लिए विकल्प छोड़ दिया। हालांकि अभी भी दस्तावेज़ीकरण में सूचीबद्ध है।

समस्या यह है कि जब आप "कंपाउंड कुंजी" फ़ील्ड पर मौजूदा डुप्लिकेट के साथ संग्रह पर इसे बनाने का प्रयास करते हैं तो अनुक्रमणिका नहीं बनाई जा रही है और त्रुटियां हैं। उपरोक्त पर, अनुक्रमणिका निर्माण को इसे शेल में प्राप्त करना चाहिए:

{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "errmsg" : "exception: E11000 duplicate key error dup key: { : 15.0, : 1.0 }",
    "code" : 11000,
    "ok" : 0
}

जब कोई डुप्लीकेट मौजूद नहीं है तो आप इंडेक्स बना सकते हैं जैसा कि आप वर्तमान में कोशिश कर रहे हैं और इसे बनाया जाएगा।

तो इस के आसपास काम करने के लिए, पहले इस तरह की प्रक्रिया के साथ डुप्लिकेट को हटा दें:

db.events.aggregate([
    { "$group": {
        "_id": { "uid": "$uid", "sid": "$sid" },
        "dups": { "$push": "$_id" },
        "count": { "$sum": 1 }
    }},
    { "$match": { "count": { "$gt": 1 } }}
]).forEach(function(doc) {
    doc.dups.shift();
    db.events.remove({ "_id": {"$in": doc.dups }});
});

db.events.createIndex({"uid":1 , "sid": 1},{unique:true})

फिर डुप्लिकेट डेटा वाले आगे के इंसर्ट नहीं डाले जाएंगे और उचित त्रुटि दर्ज की जाएगी।

यहां अंतिम नोट यह है कि "ड्रॉपडुप्स" डुप्लिकेट डेटा को हटाने के लिए एक बहुत ही सुंदर समाधान नहीं है। जैसा कि ऊपर दिखाया गया है, आप वास्तव में अधिक नियंत्रण के साथ कुछ चाहते हैं।

दूसरे भाग के लिए, .insert() . का उपयोग करने के बजाय .update() . का उपयोग करें तरीका। इसमें एक "अप्सर्ट" विकल्प है

$collection->update(
    array( "uid" => 1, "sid" => 1 ),
    array( '$set' => $someData ),
    array( 'upsert' => true )
);

तो "पाए गए" दस्तावेज़ "संशोधित" हैं और जो दस्तावेज़ नहीं मिले हैं वे "सम्मिलित" हैं। यह भी देखें $setOnInsert केवल कुछ डेटा बनाने के तरीके के लिए जब दस्तावेज़ वास्तव में डाला जाता है और संशोधित होने पर नहीं।

आपके विशिष्ट प्रयास के लिए, .update() . का सही सिंटैक्स तीन तर्क है। "क्वेरी", "अपडेट" और "विकल्प":

$collection->update(
    array( "uid" => 1, "sid" => 1 ),
    array(
        '$set' => array( "field" => "this" ),
        '$inc' => array( "counter" => 1 ),
        '$setOnInsert' => array( "newField" => "another" )
   ),
   array( "upsert" => true )
);

किसी भी अपडेट ऑपरेशन को "उसी पथ तक पहुंचने" की अनुमति नहीं है जैसा कि "अपडेट" दस्तावेज़ अनुभाग में किसी अन्य अपडेट ऑपरेशन में उपयोग किया गया था।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. नोडज मोंगोडब ऑब्जेक्ट आईडी स्ट्रिंग करने के लिए

  2. मोंगोडब में दिनांक/समय स्टोर करने का सबसे अच्छा तरीका

  3. मैं Mongoose/Node.js में एक साथ कई दस्तावेज़ कैसे सहेज सकता हूँ?

  4. mongoDB में समूह कैसे करें और परिणाम में सभी फ़ील्ड वापस करें

  5. ClusterControl के साथ शुरुआत कैसे करें