MongoDB-এ একটি ডকুমেন্টের ভেতরের অ্যারেতে থাকা ডুপ্লিকেট Name ফিল্ডের কাউন্ট এবং সংশ্লিষ্ট Subject লিস্ট বের করতে $unwind, $group (with $push), এবং $project (with $size) ব্যবহার করা হয়।
উদাহরণ: কালেকশন ও ডেটা তৈরি
> db.demo558.insertOne({
_id: 100,
CountryCode: 101,
details: [
{ Name: "Chris", Subject: "MySQL" },
{ Name: "Chris", Subject: "MongoDB" },
{ Name: "Chris", Subject: "Java" },
{ Name: "Bob", Subject: "Python" },
{ Name: "Bob", Subject: "Java" }
]
});
{ "acknowledged" : true, "insertedId" : 100 }
সব ডকুমেন্ট দেখানো
> db.demo558.find();
আউটপুট:
{ "_id" : 100, "CountryCode" : 101, "details" : [
{ "Name" : "Chris", "Subject" : "MySQL" },
{ "Name" : "Chris", "Subject" : "MongoDB" },
{ "Name" : "Chris", "Subject" : "Java" },
{ "Name" : "Bob", "Subject" : "Python" },
{ "Name" : "Bob", "Subject" : "Java" }
] }
Aggregation কোয়েরি: নাম অনুযায়ী কাউন্ট ও সাবজেক্ট লিস্ট
> db.demo558.aggregate([
{ $unwind: "$details" },
{ $group: {
_id: "$details.Name",
NameCount: { $sum: 1 },
Subject: { $push: "$details.Subject" }
}},
{ $project: {
NameCount: 1,
SubjectCount: { $size: "$Subject" }
}}
]).pretty()
কোয়েরির ব্যাখ্যা
$unwind: "$details"— অ্যারে ফ্ল্যাটেন করে।$group—details.Nameঅনুযায়ী গ্রুপ করে:NameCount: { $sum: 1 }— প্রতিটি নামের কাউন্ট।Subject: { $push: "$details.Subject" }— সব সাবজেক্ট একটি অ্যারেতে সংগ্রহ করে।
$project— আউটপুট ফরম্যাট:NameCount: 1— কাউন্ট রাখুন।SubjectCount: { $size: "$Subject" }— সাবজেক্ট অ্যারের সাইজ (লেন্থ) বের করে।
আউটপুট
{ "_id" : "Bob", "NameCount" : 2, "SubjectCount" : 2 }
{ "_id" : "Chris", "NameCount" : 3, "SubjectCount" : 3 }
মূল পয়েন্টসমূহ
$pushগ্রুপের সব মান অ্যারেতে সংগ্রহ করে (ডুপ্লিকেট রেখে)।$addToSetব্যবহার করলে ডুপ্লিকেট বাদ দিয়ে ইউনিক মানগুলোই রাখবে।$sizeঅ্যারের লেন্থ বের করে (শুধু$project-এ কাজ করে,$group-এ নয়)।$unwindবড় অ্যারে বা বড় ডেটাসেটে পারফরম্যান্স প্রভাবিত করতে পারে।