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

MongoDB से डुप्लिकेट निकालें

"ड्रॉपडुप्स" इंडेक्स निर्माण के लिए सिंटैक्स को मोंगोडीबी 2.6 के रूप में "बहिष्कृत" किया गया है और मोंगोडीबी 3.0 में हटा दिया गया है। ज्यादातर मामलों में इसका उपयोग करना बहुत अच्छा विचार नहीं है क्योंकि "निष्कासन" मनमाना है और किसी भी "डुप्लिकेट" को हटाया जा सकता है। जिसका अर्थ है कि जो "हटाया" जाता है वह वह नहीं हो सकता जिसे आप वास्तव में हटाना चाहते हैं।

किसी भी तरह, आप "इंडेक्स लेंथ" त्रुटि में चल रहे हैं क्योंकि यहां इंडेक्स कुंजी का मान अधिक लंबा होगा जिसकी अनुमति है। सामान्यतया, आप किसी भी सामान्य अनुप्रयोग में 43 फ़ील्ड को अनुक्रमित करने के लिए "मतलब" नहीं हैं।

यदि आप किसी संग्रह से "डुप्लिकेट" को हटाना चाहते हैं तो आपकी सबसे अच्छी शर्त यह निर्धारित करने के लिए एकत्रीकरण क्वेरी चलाने के लिए है कि कौन से दस्तावेज़ों में "डुप्लिकेट" डेटा है और फिर उस सूची के माध्यम से पहले से ही "अद्वितीय" <के "सभी लेकिन एक" को हटा दें। कोड>_आईडी लक्ष्य संग्रह से मूल्य। यह अधिकतम दक्षता के लिए "बल्क" संचालन के साथ किया जा सकता है।

नोट :मुझे यह विश्वास करना कठिन लगता है कि आपके दस्तावेज़ों में वास्तव में 43 "अद्वितीय" फ़ील्ड हैं। यह संभव है कि "आप सभी को चाहिए" केवल केवल identify की पहचान करना है वे फ़ील्ड जो दस्तावेज़ को "अद्वितीय" बनाते हैं और फिर नीचे दी गई प्रक्रिया का पालन करते हैं:

var bulk = db.testkdd.initializeOrderedBulkOp(),
    count = 0;

// List "all" fields that make a document "unique" in the `_id`
// I am only listing some for example purposes to follow
db.testkdd.aggregate([
    { "$group": {
        "_id": {
           "duration" : "$duration",
          "protocol_type": "$protocol_type", 
          "service": "$service",
          "flag": "$flag"
        },
        "ids": { "$push": "$_id" },
        "count": { "$sum": 1 }
    }},
    { "$match": { "count": { "$gt": 1 } } }
],{ "allowDiskUse": true}).forEach(function(doc) {
    doc.ids.shift();     // remove first match
    bulk.find({ "_id": { "$in": doc.ids } }).remove();  // removes all $in list
    count++;

    // Execute 1 in 1000 and re-init
    if ( count % 1000 == 0 ) {
       bulk.execute();
       bulk = db.testkdd.initializeOrderedBulkOp();
    }
});

if ( count % 1000 != 0 ) 
    bulk.execute();

यदि आपके पास MongoDB संस्करण 2.6 से "निचला" है और आपके पास थोक संचालन नहीं है तो आप मानक .remove() के साथ प्रयास कर सकते हैं लूप के अंदर भी। यह भी ध्यान दें कि .aggregate() यहां कोई कर्सर नहीं लौटाएगा और लूपिंग को इसमें बदलना होगा:

db.testkdd.aggregate([
   // pipeline as above
]).result.forEach(function(doc) {
    doc.ids.shift();  
    db.testkdd.remove({ "_id": { "$in": doc.ids } });
});

लेकिन अपने दस्तावेज़ों को बारीकी से देखना सुनिश्चित करें और केवल "अद्वितीय" फ़ील्ड शामिल करें जिनकी आप समूह _id का हिस्सा बनने की उम्मीद करते हैं . अन्यथा आप कुछ भी नहीं हटाते हैं, क्योंकि वहां कोई डुप्लीकेट नहीं है।




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. मैं async विधि में कोड डीबग क्यों नहीं कर सकता?

  2. ऑब्जेक्ट आईडी (मोंगोडब) को जावास्क्रिप्ट में स्ट्रिंग में बदलें

  3. क्या जानना है जब उत्पादन में MongoDB के साथ काम करना शुरू करें - दस युक्तियाँ

  4. mongodb $ मौजूद है जो हमेशा 0 लौटाता है

  5. मोंगोडीबी $indexOfBytes