MongoDB এগ্রিগেশনে $match এবং $filter দিয়ে সাব-ডকুমেন্ট/অ্যারে এলিমেন্ট ফিল্টার করা
MongoDB-এ একটি ডকুমেন্টের ভেতরে অ্যারে-র ভেতরে সাব-ডকুমেন্ট থাকলে, নির্দিষ্ট শর্ত (Criteria) অনুযায়ী শুধু সেই সাব-ডকুমেন্টগুলো বের করতে এগ্রিগেশন পাইপলাইনে $match (ডকুমেন্ট লেভেল ফিল্টার) এবং $addFields + $filter (অ্যারে লেভেল ফিল্টার) ব্যবহার করা হয়।
১. কালেকশন ও নেস্টেড ডেটা তৈরি
> db.demo345.insertOne({
"UserName": "Robert",
"UserDetails": [
{ "isMarried": false, "CountryName": "US" },
{ "isMarried": true, "CountryName": "UK" },
{ "isMarried": false, "CountryName": "AUS" }
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e5404fdf8647eb59e5620ac") }
২. ডকুমেন্ট দেখানো
> db.demo345.find();
আউটপুট:
{ "_id" : ObjectId("5e5404fdf8647eb59e5620ac"), "UserName" : "Robert", "UserDetails" : [ { "isMarried" : false, "CountryName" : "US" }, { "isMarried" : true, "CountryName" : "UK" }, { "isMarried" : false, "CountryName" : "AUS" } ] }
৩. এগ্রিগেশন কোয়েরি: UserName "Robert" এবং isMarried=true থাকা সাব-ডকুমেন্ট
> db.demo345.aggregate([
{ $match: { UserName: "Robert" } },
{ $addFields: {
UserDetails: { $filter: {
input: "$UserDetails",
cond: { $eq: ["$$this.isMarried", true] }
}}
}}
])
স্টেজ ব্যাখ্যা:
$match- প্রথমে UserName "Robert" वाले ডকুমেন্টটি সিলেক্ট করে।$addFields- UserDetails ফিল্ডকে ফিল্টার করা ভার্শন দিয়ে রিপ্লেস করে।$filter- UserDetails অ্যারে-র প্রতিটি এলিমেন্ট ($$this) চেক করেisMarried: trueথাকলে রাখে।
৪. ফলাফল
{ "_id" : ObjectId("5e5404fdf8647eb59e5620ac"), "UserName" : "Robert", "UserDetails" : [ { "isMarried" : true, "CountryName" : "UK" } ] }
শুধু UK (isMarried: true) বাকি থাকেছে। US এবং AUS (isMarried: false) বাদ পড়েছে। মূল ডকুমেন্ট ডাটাবেসে অপরিবর্তিত রয়েছে।