MongoDB এগ্রিগেশনে $match এবং $filter দিয়ে অ্যারে-র নির্দিষ্ট রেঞ্জের এলিমেন্ট বের করা
MongoDB-এ একটি ডকুমেন্টের অ্যারে ফিল্ড থেকে নির্দিষ্ট রেঞ্জ (Range)য় পড়া এলিমেন্টগুলো মাত্র বের করতে এগ্রিগেশন পাইপলাইনে $match (ডকুমেন্ট ফিল্টার) এবং $addFields + $filter (অ্যারে ফিল্টার) কম্বাইন করে ব্যবহার করা হয়।
১. কালেকশন ও প্রোডাক্ট ডেটা তৈরি
> db.demo351.insertOne({
"_id": "101",
"ProductDetails": [
{ "ProductName": "Product-1", "ProductPrice": 500 },
{ "ProductName": "Product-2", "ProductPrice": 400 }
]
});
{ "acknowledged" : true, "insertedId" : "101" }
> db.demo351.insertOne({
"_id": "102",
"ProductDetails": [
{ "ProductName": "Product-3", "ProductPrice": 200 },
{ "ProductName": "Product-4", "ProductPrice": 800 }
]
});
{ "acknowledged" : true, "insertedId" : "102" }
২. সব ডকুমেন্ট দেখানো
> db.demo351.find();
আউটপুট:
{ "_id" : "101", "ProductDetails" : [ { "ProductName" : "Product-1", "ProductPrice" : 500 }, { "ProductName" : "Product-2", "ProductPrice" : 400 } ] }
{ "_id" : "102", "ProductDetails" : [ { "ProductName" : "Product-3", "ProductPrice" : 200 }, { "ProductName" : "Product-4", "ProductPrice" : 800 } ] }
৩. এগ্রিগেশন কোয়েরি: _id "102" এবং Price 600-900 এর মধ্যে
> db.demo351.aggregate([
{ $match: { _id: "102" } },
{ $addFields: {
ProductDetails: { $filter: {
input: "$ProductDetails",
cond: { $and: [
{ $gt: ["$$this.ProductPrice", 600] },
{ $lt: ["$$this.ProductPrice", 900] }
]}
}}
}}
])
স্টেজ ব্যাখ্যা:
$match- প্রথমে _id "102" ডকুমেন্টটি সিলেক্ট করে।$addFields- ProductDetails ফিল্ডকে নতুন ফিল্টার করা ভার্শন দিয়ে ওভাররাইট করে।$filter- অ্যারে-র প্রতিটি এলিমেন্ট ($$this) চেক করে 600 < Price < 900 শর্ত পূরণ করলে রাখে।
৪. ফলাফল
{ "_id" : "102", "ProductDetails" : [ { "ProductName" : "Product-4", "ProductPrice" : 800 } ] }
Product-3 (Price 200) বাদ পড়েছে, শুধু Product-4 (Price 800) বাকি থাকেছে। মূল ডকুমেন্ট ডাটাবেসে অপরিবর্তিত।