MongoDB-এ একটি ডকুমেন্টের ভেতরের সাবডকুমেন্ট অ্যারে (subdocument array) থেকে নির্দিষ্ট প্যাটার্ন মэтচ করে ডেটা বের করতে $unwind, $match (with $regex), এবং $group স্টেজ ব্যবহার করা হয়।
উদাহরণ: কালেকশন ও ডেটা তৈরি
> db.demo556.insertOne({
_id: 101,
details: [
{ id: "234336", Name: "Chris" },
{ id: "123456", Name: "Bob" },
{ id: "234987", Name: "Carol" },
{ id: "989768", Name: "David" },
{ id: "234888", Name: "Sam" },
{ id: "847656", Name: "John" }
]
});
{ "acknowledged" : true, "insertedId" : 101 }
সব ডকুমেন্ট দেখানো
> db.demo556.find();
আউটপুট:
{ "_id" : 101, "details" : [
{ "id" : "234336", "Name" : "Chris" },
{ "id" : "123456", "Name" : "Bob" },
{ "id" : "234987", "Name" : "Carol" },
{ "id" : "989768", "Name" : "David" },
{ "id" : "234888", "Name" : "Sam" },
{ "id" : "847656", "Name" : "John" }
] }
Aggregation কোয়েরি: id "234" দিয়ে শুরু হওয়া সাবডকুমেন্ট বের করা
> db.demo556.aggregate([
{ $match: { "_id": 101 } },
{ $unwind: "$details" },
{ $match: { "details.id": { $regex: /^234/ } } },
{ $group: {
_id: "$_id",
"Detail": { $push: "$details" }
} }
]).pretty();
কোয়েরির ব্যাখ্যা
$match: { "_id": 101 }— শুধু_id: 101वाला ডকুমেন্ট সিলেক্ট করে।$unwind: "$details"—detailsঅ্যারেতে থাকা প্রতিটি সাবডকুমেন্টকে আলাদা ডকুমেন্ট হিসেবে ফ্ল্যাটেন (flatten) করে।$match: { "details.id": { $regex: /^234/ } }—details.idফিল্ড "234" দিয়ে শুরু হয় কিনা চেক করে (Regex^234)।$group— আবার_idঅনুযায়ী গ্রুপ করে ফিল্টার করা সাবডকুমেন্টগুলোDetailঅ্যারেতে পুশ করে।
আউটপুট
{
"_id" : 101,
"Detail" : [
{ "id" : "234336", "Name" : "Chris" },
{ "id" : "234987", "Name" : "Carol" },
{ "id" : "234888", "Name" : "Sam" }
]
}
মূল পয়েন্টসমূহ
$unwindঅ্যারে ডিকনস্ট্রাক্ট (deconstruct) করতে ব্যবহৃত হয়।$regexপ্যাটার্ন ম্যাচিংয়ের জন্য ব্যবহার করা হয় (এখানে^234মানে "234" দিয়ে শুরু)۔- পারফরম্যান্সের জন্য প্রথমে
$matchদিয়ে ডকুমেন্ট ফিল্টার করা ভালো প্র্যাকটিস। - বড় ডেটাসেটে
$unwindপারফরম্যান্স প্রভাবিত করতে পারে, إندেক্স (index) ব্যবহার করুন।