การคำนวณผลรวม (sum) ของ field 数值ภายใน array ของแต่ละเอกสาร ทำได้ด้วย $sum ใน stage $project ของ aggregate pipeline
สร้างคอลเลกชันและข้อมูลตัวอย่าง
> db.demo96.insertOne({
... "Name" : "Chris",
... "Details" : [
... { Marks:67 },
... { Marks:33 },
... { Marks:50 }
... ]
... });
{ "acknowledged" : true, "insertedId" : ObjectId("5e2d6aadb8903cdd865577ad") }
แสดงข้อมูล
> db.demo96.find();
ผลลัพธ์:
{ "_id" : ObjectId("5e2d6aadb8903cdd865577ad"), "Name" : "Chris", "Details" : [
{ "Marks" : 67 }, { "Marks" : 33 }, { "Marks" : 50 }
] }
Query หาผลรวม Marks ใน Array
> db.demo96.aggregate([
... { "$project": {
... "Name": 1,
... "TotalMarks": { "$sum": "$Details.Marks" }
... }}
... ]);
คำอธิบาย:
"$Details.Marks": MongoDB จะดึงค่า Marks จากทุก element ใน array Details มาเป็น array ของตัวเลข$sum: เมื่อได้รับ array จะคำนวณผลรวมอัตโนมัติ"Name": 1: รวม field Name ในผลลัพธ์
ผลลัพธ์
{ "_id" : ObjectId("5e2d6aadb8903cdd865577ad"), "Name" : "Chris", "TotalMarks" : 150 }
67 + 33 + 50 = 150 ✓
การประยุกต์ใช้เพิ่มเติม
กรองเฉพาะค่าที่ผ่านเงื่อนไข: ใช้ $filter ก่อน $sum
db.demo96.aggregate([
{ $project: {
Name: 1,
TotalMarks: {
$sum: {
$filter: {
input: "$Details.Marks",
cond: { $gte: ["$$this", 50] }
}
}
}
}}
])
จะรวมเฉพาะค่าที่ ≥ 50 (67 + 50 = 117)
รวมทุกเอกสาร (Global Sum): ใช้ $group แทน $project
db.demo96.aggregate([
{ $unwind: "$Details" },
{ $group: { _id: null, GrandTotal: { $sum: "$Details.Marks" } } }
])