গভীর নেস্টেড অ্যারে অ্যাগ্রিগেশন
MongoDB-এ একাধিক লেভেল নেস্টেড অ্যারে প্রক্রিয়া করতে aggregate() পাইপলাইনে $addFields, $map, $let, $cond ইত্যাদি ব্যবহার করা হয়।
নমুনা ডেটা তৈরি
> db.demo441.insertOne({
"Name": "David", "Age": 21,
"details": [{
"id": 1, "CountryName": "US",
"details1": [
{ "SubjectName": "MySQL", "Score": 56 },
{ "SubjectName": "MongoDB", "Score": 78 }
]
}]
})
সমস্ত ডকুমেন্ট দেখানো
> db.demo441.find()
আউটপুট:
{ "_id": ObjectId("..."), "Name": "David", "Age": 21, "details": [{ "id": 1, "CountryName": "US", "details1": [{ "SubjectName": "MySQL", "Score": 56 }, { "SubjectName": "MongoDB", "Score": 78 }] }] }
নেস্টেড অ্যারে অ্যাগ্রিগেশন কোয়েরি
> db.demo441.aggregate([
{ $addFields: {
ResultOfDetails: {
$map: {
input: "$details",
as: "output",
in: {
id: "$$output.id",
CountryName: "$$output.CountryName",
details1: {
$let: {
vars: {
last: { $arrayElemAt: ["$$output.details1", -1] }
},
in: {
$cond: [
{ $eq: ["$$last.Score", 78] },
["$$last"],
[]
]
}
}
}
}
}
}
}}
]).pretty()
ফলাফল:
{ "_id": ObjectId("..."), "Name": "David", "Age": 21, "details": [...], "ResultOfDetails": [{ "id": 1, "CountryName": "US", "details1": [{ "SubjectName": "MongoDB", "Score": 78 }] }] }
ব্যাখ্যা
$map: বাইরেরdetailsঅ্যারে ইটারেট করে$let: ভেরিয়েবল ডিক্লেয়ার করে (last= শেষ এলিমেন্ট)$arrayElemAt: [..., -1]: অ্যারের শেষ এলিমেন্ট নেয়$cond: শর্ত পূরণ হলে (Score 78) সেই এলিমেন্ট রাখে, না হলে খালি অ্যারে- ফলাফলে
ResultOfDetailsনামে নতুন ফিল্ডে ফিল্টার করা ডেটা থাকে
জটিল নেস্টেড স্ট্রাকচার প্রক্রিয়ার জন্য এই প্যাটার্ন খুব কার্যকর।