MongoDB-এ দুটি ফিল্ডের কম্বিনেশন (Compound Key) অনুযায়ী ডুপ্লিকেট ডকুমেন্ট সনাক্ত করে সরাতে অ্যাগ্রিগেশন পাইপলাইনে $sort, $group, $replaceRoot এবং $out স্টেজ ব্যবহার করা হয়।
কলেকশন এবং ডকুমেন্ট তৈরি
> db.demo108.insertOne({"Value1":23,"Value2":24});
{ "acknowledged" : true, "insertedId" : ObjectId("5e2ee3e49fd5fd66da214477") }
> db.demo108.insertOne({"Value1":23,"Value2":25});
{ "acknowledged" : true, "insertedId" : ObjectId("5e2ee3f29fd5fd66da214478") }
> db.demo108.insertOne({"Value1":23,"Value2":24});
{ "acknowledged" : true, "insertedId" : ObjectId("5e2ee3f59fd5fd66da214479") }
সব ডকুমেন্ট দেখানো (ডুপ্লিকেট সহ)
> db.demo108.find();
আউটপুট:
{ "_id" : ObjectId("5e2ee3e49fd5fd66da214477"), "Value1" : 23, "Value2" : 24 }
{ "_id" : ObjectId("5e2ee3f29fd5fd66da214478"), "Value1" : 23, "Value2" : 25 }
{ "_id" : ObjectId("5e2ee3f59fd5fd66da214479"), "Value1" : 23, "Value2" : 24 }
১ম এবং ৩য় ডকুমেন্টে Value1: 23, Value2: 24 একই (ডুপ্লিকেট)।
ডুপ্লিকেট সরানোর কোয়ারী
> db.demo108.aggregate([
... { "$sort": { "_id": 1 } },
... { "$group": {
... "_id": { "Value1": "$Value1", "Value2": "$Value2" },
... "doc": { "$first": "$$ROOT" }
... }},
... { "$replaceRoot": { "newRoot": "$doc" } },
... { "$out": "demo108" }
... ]);
ফলাফল (ডুপ্লিকেট মুছে ফেলা হয়েছে)
> db.demo108.find();
{ "_id" : ObjectId("5e2ee3f29fd5fd66da214478"), "Value1" : 23, "Value2" : 25 }
{ "_id" : ObjectId("5e2ee3e49fd5fd66da214477"), "Value1" : 23, "Value2" : 24 }
স্টেপ বাই স্টেপ ব্যাখ্যা:
$sort: {_id: 1}- পুরনো ডকুমেন্ট আগে আসবে (প্রথম ইনসার্টেড রাখতে)$group-Value1এবংValue2কম্বিনেশন অনুযায়ী গ্রুপ,$firstদিয়ে প্রতিটি গ্রুপের প্রথম ডকুমেন্ট ($$ROOT) রাখা$replaceRoot- গ্রুপের আউটপুট ফরম্যাট থেকে মূল ডকুমেন্ট স্ট্রাকচার ফেরত আনা$out: "demo108"- ফলাফলকে একই কালেকশনে ওভাররাইট করা (সতর্কতা: পুরানো ডেটা হারাবে!)
সতর্কতা: $out কালেকশনটি পুরোপুরি রিপ্লেস করে দেয়। প্রোডাকশনে ব্যবহার করার আগে ব্যাকআপ নিন বা নতুন কালেকশন নাম দিন (যেমন $out: "demo108_deduped")।
বিকল্প পদ্ধতি (ইউনিক ইনডেক্স দিয়ে):
db.demo108.createIndex({Value1: 1, Value2: 1}, {unique: true, dropDups: true})
দ্রষ্টব্য: dropDups MongoDB 3.0+ এ ডিপ্রিকেটেড।