Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

หาผลรวม Field ภายใน Array ด้วย MongoDB

การคำนวณผลรวม (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" } } }
])