MongoDB-এ $unwind, $group, $match ব্যবহার করে নেস্টেড অ্যারে-র ডুপ্লিকেট ফিল্ড খুঁজে বের করা
MongoDB-এ একটি ডকুমেন্টের ভেতরে নেস্টেড অ্যারে থাকলে, সেটির ভেতরের ফিল্ডে ডুপ্লিকেট মান আছে কিনা চেক করতে এগ্রিগেশন পাইপলাইনে $unwind (অ্যারে ফ্ল্যাটেন), $group (গ্রুপিং), $match (ফিল্টার) ব্যবহার করা হয়।
১. কালেকশন ও ডুপ্লিকেট ডেটা সহ ডকুমেন্ট তৈরি
> db.demo347.insertOne({ "details": { "details1": [ { Name: "Chris", Age: 21 } ] } });
{ "acknowledged" : true, "insertedId" : ObjectId("5e5532eaf8647eb59e5620af") }
> db.demo347.insertOne({ "details": { "details1": [ { Name: "David", Age: 22 } ] } });
{ "acknowledged" : true, "insertedId" : ObjectId("5e55330af8647eb59e5620b0") }
> db.demo347.insertOne({ "details": { "details1": [ { Name: "Chris", Age: 21 } ] } });
{ "acknowledged" : true, "insertedId" : ObjectId("5e55331cf8647eb59e5620b1") }
২. সব ডকুমেন্ট দেখানো
> db.demo347.find();
আউটপুট:
{ "_id" : ObjectId("5e5532eaf8647eb59e5620af"), "details" : { "details1" : [ { "Name" : "Chris", "Age" : 21 } ] } }
{ "_id" : ObjectId("5e55330af8647eb59e5620b0"), "details" : { "details1" : [ { "Name" : "David", "Age" : 22 } ] } }
{ "_id" : ObjectId("5e55331cf8647eb59e5620b1"), "details" : { "details1" : [ { "Name" : "Chris", "Age" : 21 } ] } }
"Chris", 21 দুবার রিপিট হয়েছে (পहেল এবং তৃতীয় ডকুমেন্টে)।
৩. এগ্রিগেশন কোয়েরি: ডুপ্লিকেট Name খুঁজে বের করা
> db.demo347.aggregate([
{ "$unwind": "$details" },
{ "$unwind": "$details.details1" },
{ "$group": { "_id": "$details.details1.Name", "count": { "$sum": 1 } } },
{ "$match": { "_id": { "$ne": null }, "count": { "$gt": 1 } } }
])
স্টেজ ব্যাখ্যা:
$unwind: "$details"- details অবজেক্টকে ফ্ল্যাটেন (প্রতিটি ডকুমেন্টের জন্য একটি রো)।$unwind: "$details.details1"- details1 অ্যারে-র প্রতিটি এলিমেন্টকে আলাদা রো বানায়।$group- Name ফিল্ড দিয়ে গ্রুপ করে কাউন্ট করে।$match- count > 1 এবং _id != null (ডুপ্লিকেট ফিল্টার)।
৪. ফলাফল
{ "_id" : "Chris", "count" : 2 }
"Chris" নামটি ২ বার পাওয়া গেছে। এটি ডেটা কোয়ালিটি চেক বা ডিডিউপ্লিকেশনের জন্য খুব উপকারী।