2012-02-17 16 views
5

मेरे पास mongodb में एक बड़ा संग्रह (~ 2.7 मिलियन दस्तावेज़) है, और बहुत सारे डुप्लिकेट हैं। मैंने संग्रह पर ensureIndex({id:1}, {unique:true, dropDups:true}) चलाने का प्रयास किया। too many dups on index build with dropDups=true का फैसला करने से पहले मोंगो थोड़ी देर के लिए इसे दूर कर देता है।मैं MongoDb में डुप्लीकेट कैसे हटा सकता हूं?

मैं इंडेक्स कैसे जोड़ सकता हूं और डुप्लिकेट से छुटकारा पा सकता हूं? या दूसरी तरफ, कुछ डुप्लिकेट को हटाने का सबसे अच्छा तरीका क्या है ताकि मोंगो सफलतापूर्वक इंडेक्स बना सके?

बोनस अंक के लिए, डुप्लिकेट की संख्या को सीमित क्यों किया जा सकता है?

+0

एक विकल्प के रूप में: प्रत्येक आईडी के लिए एक मानचित्र चलाएं/उस गणना को कम करें। फिर इस परिणाम को चलाएं और डुप्लीकेट के साथ प्रत्येक 'आईडी' के लिए सभी रिकॉर्ड हटाएं लेकिन पहले। –

उत्तर

5

बोनस अंक के लिए, डुप्लिकेट की संख्या को क्यों सीमित किया जा सकता है?

मोंगो डीबी अपने आप को बचाने के लिए ऐसा कर रहा है। यदि आप गलत क्षेत्र पर dropDups हैं, तो आप संपूर्ण डेटासेट को नली बना सकते हैं और हटाए गए ऑपरेशन के साथ डीबी को लॉक कर सकते हैं (जो लिखने के रूप में "महंगे" हैं)।

मैं इंडेक्स कैसे जोड़ सकता हूं और डुप्लीकेट से छुटकारा पा सकता हूं?

तो पहला सवाल यह है कि आप id फ़ील्ड पर एक अद्वितीय अनुक्रमणिका क्यों बना रहे हैं?

MongoDB एक डिफ़ॉल्ट _id फ़ील्ड बनाता है जो स्वचालित रूप से अद्वितीय और अनुक्रमित होता है। डिफ़ॉल्ट रूप से MongoDB _id को ObjectId के साथ पॉप्युलेट करता है, हालांकि, आप इसे जो भी मूल्य पसंद करते हैं, उसे ओवरराइड कर सकते हैं। इसलिए यदि आपके पास आईडी मानों का एक तैयार सेट है, तो आप उन का उपयोग कर सकते हैं।

यदि आप मानों को दोबारा आयात नहीं कर सकते हैं, तो को _id में बदलते समय उन्हें एक नए संग्रह में कॉपी करें। फिर आप पुराने संग्रह को छोड़ सकते हैं और नए नाम का नाम बदल सकते हैं। "बहुत से dups" के लिए एक समाधान खोजने की कोशिश करते हुए समस्या (ध्यान दें कि आप "नकली चाबी त्रुटि" का एक समूह मिल जाएगा, सुनिश्चित करें कि आपके कोड कैच और उन्हें पर ध्यान नहीं देता)

+2

संपादित करें आवश्यक है! MongoDB में परिवर्तन के कारण> = 3. * –

3

मैं इस सवाल में आए (स्रोत से संग्रह को फिर से बनाये बिना)।

db.c1.find().forEach(function(x){db.c2.update({field1:x.field1, field2:x.field2}, x, {upsert:true})}) 

जहां field1 के संयोजन और: जिस तरह से मैं अंत में यह एक नया संग्रह c2 बनाने, जरूरत क्षेत्र (रों) पर एक अद्वितीय सूचकांक जोड़कर है और फिर Upsert कर (विशुद्ध उद्देश्य गति के लिए) किया field2 अद्वितीय होना चाहिए। फिर कोई प्रारंभिक संग्रह c1 छोड़ सकता है और नया नाम बदल सकता है। जैसा कि दिखाया गया है, यह समाधान एक या एकाधिक फ़ील्ड के लिए काम कर सकता है।

संबंधित मुद्दे