Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Cách tính tổng giá trị một trường trên tất cả document MongoDB

Để tính tổng giá trị của một trường (key) trên tất cả document trong collection MongoDB, bạn sử dụng Aggregation Framework với toán tử $sum.

Ví dụ minh họa

Tạo collection và dữ liệu

> db.sumOfValueDemo.insertOne({"Name":"Larry","Amount":14.50});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8ee7272f684a30fbdfd592") }
> db.sumOfValueDemo.insertOne({"Name":"Mike","Amount":15.68});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8ee7342f684a30fbdfd593") }
> db.sumOfValueDemo.insertOne({"Name":"Carol","Amount":50.32});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8ee7412f684a30fbdfd594") }
> db.sumOfValueDemo.insertOne({"Name":"David","Amount":120.90});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8ee7532f684a30fbdfd595") }

Xem tất cả documents

> db.sumOfValueDemo.find().pretty();
{
    "_id" : ObjectId("5c8ee7272f684a30fbdfd592"),
    "Name" : "Larry",
    "Amount" : 14.5
}
{
    "_id" : ObjectId("5c8ee7342f684a30fbdfd593"),
    "Name" : "Mike",
    "Amount" : 15.68
}
{
    "_id" : ObjectId("5c8ee7412f684a30fbdfd594"),
    "Name" : "Carol",
    "Amount" : 50.32
}
{
    "_id" : ObjectId("5c8ee7532f684a30fbdfd595"),
    "Name" : "David",
    "Amount" : 120.9
}

Tính tổng Amount với Aggregation

> db.sumOfValueDemo.aggregate([
    { $group: { _id: '', "Amount": { $sum: "$Amount" } } },
    { $project: { _id: 0, "TotalAmount": "$Amount" } }
]);
{ "TotalAmount" : 201.4 }

Giải thích pipeline

  1. $group: Gom tất cả document vào một group (_id: null hoặc ''). Tính $sum: "$Amount" cộng dồn giá trị trường Amount.
  2. $project: Format lại output: ẩn _id, đổi tên trường Amount thành TotalAmount.

Cách đơn giản hơn (MongoDB 3.4+)

db.sumOfValueDemo.aggregate([
    { $group: { _id: null, TotalAmount: { $sum: "$Amount" } } }
])
{ "_id" : null, "TotalAmount" : 201.4 }

Tính tổng có điều kiện

// Chỉ tính Amount > 20
db.sumOfValueDemo.aggregate([
    { $match: { Amount: { $gt: 20 } } },
    { $group: { _id: null, TotalAmount: { $sum: "$Amount" } } }
])

Kết hợp nhiều phép tính

db.sumOfValueDemo.aggregate([
    { $group: { 
        _id: null, 
        TotalAmount: { $sum: "$Amount" },
        Count: { $sum: 1 },
        AvgAmount: { $avg: "$Amount" },
        MinAmount: { $min: "$Amount" },
        MaxAmount: { $max: "$Amount" }
    } }
])
{
    "_id" : null,
    "TotalAmount" : 201.4,
    "Count" : 4,
    "AvgAmount" : 50.35,
    "MinAmount" : 14.5,
    "MaxAmount" : 120.9
}

Lưu ý

  • Trường phải là kiểu số (number) để $sum hoạt động chính xác
  • Document thiếu trường hoặc trường không phải số sẽ bị bỏ qua (treated as 0)
  • Dùng $match trước $group để lọc dữ liệu, tăng hiệu năng