MongoDB में डुप्लिकेट रिकॉर्ड ढूंढें


116

मुझे मूंगो संग्रह में डुप्लिकेट फ़ील्ड कैसे मिलेंगे।

यदि कोई "नाम" फ़ील्ड डुप्लिकेट है, तो मैं जांचना चाहता हूं।

{
    "name" : "ksqn291",
    "__v" : 0,
    "_id" : ObjectId("540f346c3e7fc1054ffa7086"),
    "channel" : "Sales"
}

बहुत धन्यवाद!


5
इस प्रश्न के लिए डुप्लिकेट ध्वज अवांछित है। यह प्रश्न पूछता है कि डुप्लिकेट रिकॉर्ड कैसे खोजें, न कि उन्हें रोकने के लिए।
हैरी किंग

जवाबों:


209

एकत्रीकरण का उपयोग करें nameऔर इसके nameसाथ प्राप्त करें count > 1:

db.collection.aggregate(
    {"$group" : { "_id": "$name", "count": { "$sum": 1 } } },
    {"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1} } }, 
    {"$project": {"name" : "$_id", "_id" : 0} }
)

अधिकांश डुप्लिकेट द्वारा परिणामों को क्रमबद्ध करने के लिए:

db.collection.aggregate(
    {"$group" : { "_id": "$name", "count": { "$sum": 1 } } },
    {"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1} } }, 
    {"$sort": {"count" : -1} },
    {"$project": {"name" : "$_id", "_id" : 0} }     
)

"नाम" की तुलना में किसी अन्य स्तंभ नाम के साथ उपयोग करने के लिए, " $ नाम " को " $ column_name " में बदलें


1
"$match": {"_id" :{ "$ne" : null } - यहाँ अनावश्यक है, क्योंकि कथन का दूसरा भाग परिणाम को फ़िल्टर करने के लिए पर्याप्त होगा। तो केवल होने वाले समूह के लिए जाँच count > 1करेगा।
बैटस्क्रीम

5
Tks @BatScream। {"$ ne": null} वहाँ सिर्फ मामले में 'नाम' शून्य है या मौजूद नहीं है। एकत्रीकरण शून्य के रूप में अच्छी तरह से गिना जाएगा।
1

1
स्वागत हे। लेकिन फिर _idमैदान की जांच क्यों । यह हमेशा groupऑपरेशन के बाद शून्य नहीं होने की गारंटी है ।
बैटस्क्रीम

4
_idएक से एक दस्तावेज़ के $groupचरण अशक्त हो सकता है।
wdberkeley

1
इसका आउटपुट क्या होगा? अगर मैं चलाता हूं तो मुझे सभी दस्तावेज मिलते हैं, जिनकी मुझे आवश्यकता है मैं केवल डुप्लिकेट आईडी / नाम चाहता हूं।
कन्नन टी

24

आप पा सकते हैं listकी duplicateनिम्न का उपयोग कर नाम aggregateपाइपलाइन:

  • Groupसभी रिकॉर्ड समान हैं name
  • Matchउन groupsहोने रिकॉर्ड की तुलना में अधिक 1
  • फिर सभी डुप्लिकेट नामों के रूप में फिर groupसे projectएक array

कोड:

db.collection.aggregate([
{$group:{"_id":"$name","name":{$first:"$name"},"count":{$sum:1}}},
{$match:{"count":{$gt:1}}},
{$project:{"name":1,"_id":0}},
{$group:{"_id":null,"duplicateNames":{$push:"$name"}}},
{$project:{"_id":0,"duplicateNames":1}}
])

ओ / p:

{ "duplicateNames" : [ "ksqn291", "ksqn29123213Test" ] }

10

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

दक्षता में सुधार के लिए आप एकत्रीकरण के लिए एक $ मैच जोड़ सकते हैं।

db.collection.aggregate(
    {"$match": {"name" :{ "$ne" : null } } }, 
    {"$group" : {"_id": "$name", "count": { "$sum": 1 } } },
    {"$match": {"count" : {"$gt": 1} } }, 
    {"$project": {"name" : "$_id", "_id" : 0} }
)

3
db.getCollection('orders').aggregate([  
    {$group: { 
            _id: {name: "$name"},
            uniqueIds: {$addToSet: "$_id"},
            count: {$sum: 1}
        } 
    },
    {$match: { 
        count: {"$gt": 1}
        }
    }
])

पहले समूह को खेतों के अनुसार समूह का प्रश्न करें।

फिर हम अद्वितीय आईडी की जांच करते हैं और इसे गिनते हैं, यदि गिनती अधिक है तो 1 पूरे क्षेत्र में डुप्लिकेट है, इसलिए उस चीज़ को $ मैच क्वेरी द्वारा संभालना है।


1
यह मेरे लिए भी एक काम नहीं कर सका है। नीचे मतदान!
मैथ्यू जी 15

यह पोस्ट पुरानी है, लेकिन कुछ मदद कर सकती है। इसकी जाँच करें कि मैं अपने स्थानीय में काम कर रहा हूँ। यहां तक ​​कि मैं इस बारे में एक ब्लॉग पर आया था। कृपया एक नज़र डालें। compose.com/articles/finding-duplicate-documents-in-mongodb
अमन श्रीवास्तव

मैं इसे काम करने में सक्षम था - पुष्टि किए गए कार्य संस्करण में अपडेट करने के लिए संपादित किया गया।
AL स्ट्राइन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.