2014-11-18 8 views
55

में डुप्लिकेट रिकॉर्ड खोजें मुझे एक मोंगो संग्रह में डुप्लिकेट फ़ील्ड कैसे मिलेगा।MongoDB

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

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

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

उत्तर

14

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

  • 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: name पर

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

उपयोग एकत्रीकरण और namecount > 1 साथ मिलती है:

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

सबसे परिणामों को क्रमित करना कम से कम डुप्लिकेट es:

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

"नाम" की तुलना में एक और स्तंभ नाम के साथ प्रयोग करने के लिए, परिवर्तन "$ नाम" से "$ स्तंभ"

+1

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

+3

Tks @BatScream। {"$ ne": null} अगर 'नाम' शून्य है या अस्तित्व में है तो बस वहां है। एकत्रीकरण भी शून्य की गणना करेगा। – anhlc

+1

आपका स्वागत है। लेकिन फिर '_id' फ़ील्ड की जांच क्यों करें। यह हमेशा 'समूह' संचालन के बाद शून्य नहीं होने की गारंटी देता है। – BatScream

-1
db.collectionName.aggregate([ 
{ $group:{ 
    _id:{Name:"$name"}, 
    uniqueId:{$addToSet:"$_id"}, 
    count:{"$sum":1} 
    } 
}, 
{ $match:{ 
    duplicate:{"$gt":1} 
} 
} 
]); 

पहले समूह क्वेरी समूह क्षेत्रों के अनुसार ।

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

+0

यह मेरे लिए काम करने के लिए नहीं मिला – cpres

+0

यह मेरे लिए भी एक काम नहीं कर पाया है। मतदान नीचे! –

2

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

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

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