MongoDB এগ্রিগেশনে $match, $addFields, $filter ব্যবহার করে এম্বেডেড ডকুমেন্টের অ্যারে-র রেঞ্জ কোয়েরি
MongoDB-এ একটি অ্যারে-র ভেতরে এম্বেডেড ডকুমেন্ট থাকলে (যেমন userDetails: [{UserName, Score}]), সেটির থেকে নির্দিষ্ট রেঞ্জ (Range)য় পড়া এলিমেন্টগুলো বের করতে এগ্রিগেশন পাইপলাইন ব্যবহার করা হয়।
১. কালেকশন ও এম্বেডেড অ্যারে ডেটা তৈরি
> db.demo346.insertOne({
_id: 101,
userDetails: [ { UserName: "Chris", Score: 78 }, { UserName: "David", Score: 68 }, { UserName: "Bob", Score: 88 } ]
});
{ "acknowledged" : true, "insertedId" : 101 }
> db.demo346.insertOne({
_id: 102,
userDetails: [ { UserName: "Mike", Score: 92 }, { UserName: "Sam", Score: 62 }, { UserName: "Carol", Score: 97 } ]
});
{ "acknowledged" : true, "insertedId" : 102 }
২. সব ডকুমেন্ট দেখানো
> db.demo346.find();
আউটপুট:
{ "_id" : 101, "userDetails" : [ { "UserName" : "Chris", "Score" : 78 }, { "UserName" : "David", "Score" : 68 }, { "UserName" : "Bob", "Score" : 88 } ] }
{ "_id" : 102, "userDetails" : [ { "UserName" : "Mike", "Score" : 92 }, { "UserName" : "Sam", "Score" : 62 }, { "UserName" : "Carol", "Score" : 97 } ] }
৩. এগ্রিগেশন কোয়েরি: Score 80-99 এর মধ্যে থাকা ইউজাররা মাত্র রাখা
> db.demo346.aggregate([
{ "$match": { "$expr": { "$gte": [{ "$size": { "$ifNull": ["$userDetails", []] } }, 1] }}},
{ "$addFields": {
"userDetails": { "$filter": {
"input": { "$ifNull": ["$userDetails", []] },
"cond": { "$and": [
{ "$gte": ["$$this.Score", 80] },
{ "$lte": ["$$this.Score", 99] }
]}
}}
}}
])
স্টেজ ব্যাখ্যা:
$match + $expr + $size + $ifNull- শুধু যেসব ডকুমেন্টে userDetails অ্যারে আছে এবং কমপক্ষে ১টি এলিমেন্ট আছে, সেগুলোই आगे পাঠায় (Error handling)।$addFields + $filter- userDetails অ্যারে-র ভেতর থেকে Score 80-99 রেঞ্জের এলিমেন্টগুলো মাত্র রেখে বাকি বাদ দেয়।$$this- ফিল্টারের মধ্যে বর্তমান এলিমেন্টকে রিপ্রেজেন্ট করে।
৪. ফলাফল
{ "_id" : 101, "userDetails" : [ { "UserName" : "Bob", "Score" : 88 } ] }
{ "_id" : 102, "userDetails" : [ { "UserName" : "Mike", "Score" : 92 }, { "UserName" : "Carol", "Score" : 97 } ] }
প্রথম ডকুমেন্ট থেকে শুধু Bob (88), দ্বিতীয় থেকে Mike (92) এবং Carol (97) বাকি থাকেছে। Chris (78), David (68), Sam (62) বাদ পড়েছে।