নেস্টেড অ্যারে আনয়ান্ড করে কন্ডিশনাল কাউন্ট
MongoDB-এ নেস্টেড অ্যারে বিচ্ছিন্ন ($unwind) করে প্রতিটি এলিমেন্টকে আলাদা ডকুমেন্ট বানিয়ে, শর্তসাপেক্ষ ($cond) কাউন্ট করতে অ্যাগ্রিগেশন ব্যবহার করা হয়।
নমুনা ডেটা তৈরি
> db.demo478.insertOne({
"Details": {
_id: 1,
"Information": [
{ "Name": "Chris", "Age": 21 },
{ "Name": "David", "Age": 23 },
{ "Name": null, "Age": 22 },
{ "Name": null, "Age": 24 }
]
}
})
> db.demo478.insertOne({
"Details": {
_id: 2,
"Information": [
{ "Name": "Bob", "Age": 21 },
{ "Name": null, "Age": 20 }
]
}
})
সমস্ত ডকুমেন্ট দেখানো
> db.demo478.find()
আউটপুট:
{ "_id": ObjectId("..."), "Details": { "_id": 1, "Information": [{ "Name": "Chris", "Age": 21 }, { "Name": "David", "Age": 23 }, { "Name": null, "Age": 22 }, { "Name": null, "Age": 24 }] } }
{ "_id": ObjectId("..."), "Details": { "_id": 2, "Information": [{ "Name": "Bob", "Age": 21 }, { "Name": null, "Age": 20 }] } }
$unwind দিয়ে কন্ডিশনাল কাউন্ট (Name null নয় এমন কেস)
> db.demo478.aggregate([
{ $unwind: "$Details.Information" },
{ $group: {
_id: "$Details.Information.Age",
count: { $sum: { $cond: [ { $gt: ["$Details.Information.Name", null] }, 1, 0 ] } }
}},
{ $sort: { count: -1 } }
])
ফলাফল:
{ "_id": 21, "count": 2 }
{ "_id": 23, "count": 1 }
{ "_id": 24, "count": 0 }
{ "_id": 20, "count": 0 }
{ "_id": 22, "count": 0 }
ব্যাখ্যা
$unwind: "$Details.Information": নেস্টেড অ্যারে বিচ্ছিন্ন করে প্রতিটি ইনফরমেশন অবজেক্টকে আলাদা ডকুমেন্ট বানায়$group:Ageঅনুযায়ী গ্রুপ করে$cond: যদিName > null(অর্থাৎ Name আছে এবং null নয়) হয় তবে ১ যোগ করে, অন্যথায় ০$sort: { count: -1 }: সর্বোচ্চ কাউন্ট আগে দেখানোর জন্য
ফলাফলে Age 21 দুইবার আসেছে (Chris, Bob) এবং দুটোই Name আছে, তাই count=2। বাকি Age-গুলোতে Name null, তাই count=0।