MongoDB-এ অ্যারেতে নেস্টেড অবজেক্ট (ডিকশনারি) এর সংখ্যাসূচক ফিল্ডগুলোর যোগফল (sum) সব ডকুমেন্টের জন্য বের করতে $unwind এবং $group স্টেজ ব্যবহার করা হয়।
কলেকশন এবং ডকুমেন্ট তৈরি
> db.demo117.insertOne({
... ID: 101,
... Details: [
... { Name: 'Chris', Value1: 20, Value2: 30, Value3: 10 },
... { Name: 'David', Value1: 10, Value2: 50, Value3: 30 }
... ]
... });
{ "acknowledged" : true, "insertedId" : ObjectId("5e2f02ced8f64a552dae6361") }
> db.demo117.insertOne({
... ID: 102,
... Details: [
... { Name: 'Chris', Value1: 20, Value2: 10, Value3: 20 },
... { Name: 'David', Value1: 30, Value2: 40, Value3: 10 }
... ]
... });
{ "acknowledged" : true, "insertedId" : ObjectId("5e2f02ced8f64a552dae6362") }
সব ডকুমেন্ট দেখানো
> db.demo117.find();
আউটপুট:
{ "_id" : ObjectId("5e2f02ced8f64a552dae6361"), "ID" : 101, "Details" : [ { "Name" : "Chris", "Value1" : 20, "Value2" : 30, "Value3" : 10 }, { "Name" : "David", "Value1" : 10, "Value2" : 50, "Value3" : 30 } ] }
{ "_id" : ObjectId("5e2f02ced8f64a552dae6362"), "ID" : 102, "Details" : [ { "Name" : "Chris", "Value1" : 20, "Value2" : 10, "Value3" : 20 }, { "Name" : "David", "Value1" : 30, "Value2" : 40, "Value3" : 10 } ] }
যোগফল বের করার কোয়ারী
$unwind দিয়ে Details অ্যারে ফ্ল্যাটেন, তারপর $group দিয়ে Name অনুযায়ী গ্রুপ করে প্রতিটি Value ফিল্ডের যোগফল:
> db.demo117.aggregate([
... { $unwind: "$Details" },
... { $group: {
... _id: "$Details.Name",
... "Value1": { $sum: "$Details.Value1" },
... "Value2": { $sum: "$Details.Value2" },
... "Value3": { $sum: "$Details.Value3" }
... }}
... ]);
ফলাফল
{ "_id" : "David", "Value1" : 40, "Value2" : 90, "Value3" : 40 }
{ "_id" : "Chris", "Value1" : 40, "Value2" : 40, "Value3" : 30 }
গণনা যাচাই:
- Chris: Value1: 20+20=40, Value2: 30+10=40, Value3: 10+20=30
- David: Value1: 10+30=40, Value2: 50+40=90, Value3: 30+10=40
স্টেপ বাই স্টেপ ব্যাখ্যা:
$unwind: "$Details"- প্রতিটি ডকুমেন্টের Details অ্যারের এলিমেন্ট আলাদা ডকুমেন্ট বানায় (মোট ৪টি ডকুমেন্ট)$group-_id: "$Details.Name"দিয়ে নাম অনুযায়ী গ্রুপ, প্রতিটি Value ফিল্ডের$sumনিয়ে যোগফল
বিকল্প: মাল্টিপল ফিল্ড ডাইনামিকভাবে যোগ করতে (MongoDB 4.4+):
db.demo117.aggregate([
{ $unwind: "$Details" },
{ $group: {
_id: "$Details.Name",
sums: { $push: { k: "Value1", v: "$Details.Value1" } } // repetitive, better explicit
}}
])
স্পষ্ট ফিল্ড লিখতাই ভালো পারফরম্যান্স এবং পঠনযোগ্যতার জন্য।