MongoDB एग्रीगेशन में $group और $addToSet का उपयोग करके डुप्लिकेट पहचानना
MongoDB 3.x में डुप्लिकेट रिकॉर्ड खोजने के लिए एग्रीगेशन पाइपलाइन में $group का उपयोग करके समान फील्ड मान वाले दस्तावेज़ों के _id एकत्रित करें।
उदाहरण: संग्रह और दस्तावेज़ बनाना
> db.demo438.insertOne({"FirstName":"Chris"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e775c37bbc41e36cc3caea1") }
> db.demo438.insertOne({"FirstName":"David"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e775c3dbbc41e36cc3caea2") }
> db.demo438.insertOne({"FirstName":"Chris"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e775c40bbc41e36cc3caea3") }
> db.demo438.insertOne({"FirstName":"Bob"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e775c44bbc41e36cc3caea4") }
> db.demo438.insertOne({"FirstName":"David"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e775c47bbc41e36cc3caea5") }
सभी दस्तावेज़ देखना
> db.demo438.find();
आउटपुट:
{ "_id" : ObjectId("5e775c37bbc41e36cc3caea1"), "FirstName" : "Chris" }
{ "_id" : ObjectId("5e775c3dbbc41e36cc3caea2"), "FirstName" : "David" }
{ "_id" : ObjectId("5e775c40bbc41e36cc3caea3"), "FirstName" : "Chris" }
{ "_id" : ObjectId("5e775c44bbc41e36cc3caea4"), "FirstName" : "Bob" }
{ "_id" : ObjectId("5e775c47bbc41e36cc3caea5"), "FirstName" : "David" }
डुप्लिकेट पहचानने के लिए एग्रीगेशन
> db.demo438.aggregate([
{ "$group":{
_id:{FirstName:"$FirstName"},
DuplicateValueIds:{$addToSet:"$_id"}
} }
]);
आउटपुट:
{ "_id" : { "FirstName" : "David" }, "DuplicateValueIds" : [ ObjectId("5e775c47bbc41e36cc3caea5"), ObjectId("5e775c3dbbc41e36cc3caea2") ] }
{ "_id" : { "FirstName" : "Bob" }, "DuplicateValueIds" : [ ObjectId("5e775c44bbc41e36cc3caea4") ] }
{ "_id" : { "FirstName" : "Chris" }, "DuplicateValueIds" : [ ObjectId("5e775c40bbc41e36cc3caea3"), ObjectId("5e775c37bbc41e36cc3caea1") ] }
व्याख्या:
_id: {FirstName: "$FirstName"}- FirstName द्वारा ग्रुप$addToSet: "$_id"- प्रत्येक ग्रुप के _id का सेट बनाता है- सेट आकार > 1 वाले डुप्लिकेट हैं
डुप्लिकेट हटाने के लिए (पहला रखें):
// 1. डुप्लिकेट _id प्राप्त करें
var duplicates = db.demo438.aggregate([
{$group: {_id: {FirstName: "$FirstName"}, ids: {$addToSet: "$_id"}, count: {$sum: 1}}},
{$match: {count: {$gt: 1}}}
]).toArray();
// 2. प्रत्येक ग्रुप से पहला छोड़कर बाकी हटाएं
duplicates.forEach(function(doc) {
doc.ids.shift(); // पहला रखें
db.demo438.deleteMany({_id: {$in: doc.ids}});
});
आधुनिक विकल्प (MongoDB 4.2+):
// अद्वितीय इंडेक्स बनाएं (डुप्लिकेट इन्सर्ट रोकेगा)
db.demo438.createIndex({FirstName: 1}, {unique: true, dropDups: true})
// dropDups: true केवल पुराने संस्करणों में काम करता है
सर्वोत्तम अभ्यास: अद्वितीय इंडेक्स बनाकर डुप्लिकेट रोकें, मौजूदा डुप्लिकेट साफ़ करने के लिए एग्रीगेशन उपयोग करें।