MongoDB-এ একটি ডকুমেন্টের অ্যারে ফিল্ডে নির্দিষ্ট শর্ত পূরণকারী অবজেক্টের সংখ্যা (count) অনুযায়ী ডকুমেন্ট ফিল্টার করার জন্য $where (JavaScript ফাংশন) বা Aggregation Pipeline ($unwind + $group + $match) ব্যবহার করা হয়। $where ধীর এবং সিকিউরিটি রিস্ক বহন করে, তাই Aggregation প্রিয়।
উদাহরণ: কালেকশন ও ডেটা তৈরি
> db.demo694.insertOne({
details: [
{ Name: "Chris", Age: 21 },
{ Name: "David", Age: 22 }
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5ea59279ece4e5779399c07f") }
> db.demo694.insertOne({
details: [
{ Name: "Bob", Age: 21 },
{ Name: "Mike", Age: 23 }
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5ea5927aece4e5779399c080") }
> db.demo694.insertOne({
details: [
{ Name: "Chris", Age: 21 },
{ Name: "Carol", Age: 22 }
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5ea5927aece4e5779399c081") }
সব ডকুমেন্ট দেখানো
> db.demo694.find();
আউটপুট:
{ "_id" : ObjectId("5ea59279ece4e5779399c07f"), "details" : [ { "Name" : "Chris", "Age" : 21 }, { "Name" : "David", "Age" : 22 } ] }
{ "_id" : ObjectId("5ea5927aece4e5779399c080"), "details" : [ { "Name" : "Bob", "Age" : 21 }, { "Name" : "Mike", "Age" : 23 } ] }
{ "_id" : ObjectId("5ea5927aece4e5779399c081"), "details" : [ { "Name" : "Chris", "Age" : 21 }, { "Name" : "Carol", "Age" : 22 } ] }
পদ্ধতি ১: $where (JavaScript ফাংশন) — প্রস্তাবিত নয়
> var nameChrisAge21 = function() {
var inc = 0;
this.details.forEach(function(d) {
if (d.Name == "Chris" && d.Age == 21) {
inc = inc + 1;
}
});
if (inc >= 1) { return true; }
};
> db.demo694.find({ $where: nameChrisAge21 });
আউটপুট: প্রথম ও তৃতীয় ডকুমেন্ট (Chris, Age 21 আছে)۔
পদ্ধতি ২: Aggregation Pipeline (প্রস্তাবিত — দ্রুত, সিকিউর, ইন্ডেক্স ব্যবহার করে)
> db.demo694.aggregate([
{ $unwind: "$details" },
{ $match: { "details.Name": "Chris", "details.Age": 21 } },
{ $group: { _id: "$_id", count: { $sum: 1 }, details: { $push: "$details" } } },
{ $match: { count: { $gte: 1 } } },
{ $project: { _id: 1, details: 1 } }
])
Aggregation ব্যাখ্যা
$unwind— অ্যারে ফ্ল্যাটেন।$match— শর্তানুসারী সাবডকুমেন্ট ফিল্টার।$group— মূল ডকুমেন্ট (_id) অনুযায়ী গ্রুপ করে কাউন্ট (count) এবং সাবডকুমেন্টগুলো (details) সংগ্রহ।$match: { count: { $gte: 1 } }— কমপক্ষে ১টি ম্যাচ আছে এমন ডকুমেন্ট রাখুন।$project— আউটপুট ফরম্যাট।
মূল পয়েন্টসমূহ
- $where এড়ান: JavaScript ইঞ্জিন চালু করে, ধীর, ইন্ডেক্স ব্যবহার করে না, ইনজেকশন রিস্ক।
- Aggregation ব্যবহার করুন: দ্রুত, ইন্ডেক্স ব্যবহার করে, এক্সপ্রেসিভ।
$expr(MongoDB 3.6+) দিয়ে find()-এও এগরিগেশন এক্সপ্রেশন ব্যবহার করা যায়।- অ্যারে এলিমেন্ট কাউন্ট করার জন্য
$sizeব্যবহার করুন যদি পুরো অ্যারের সাইজ লাগে।