Toán tử $avg trong pipeline aggregate cho phép tính giá trị trung bình của một trường số, kể cả trường lồng nhau.
Tạo collection với trường lồng nhau
> db.demo80.insertOne({"Details":{"Price":10.5}});
{ "acknowledged" : true, "insertedId" : ObjectId("5e2bf43271bf0181ecc42297") }
> db.demo80.insertOne({"Details":{"Price":50.3}});
{ "acknowledged" : true, "insertedId" : ObjectId("5e2bf43871bf0181ecc42298") }
> db.demo80.insertOne({"Details":{"Price":100.10}});
{ "acknowledged" : true, "insertedId" : ObjectId("5e2bf43f71bf0181ecc42299") }
Truy vấn aggregate tính trung bình
Sử dụng $group với _id: null để gom toàn bộ collection, truy cập trường lồng bằng dot notation:
> db.demo80.aggregate([
... {
... "$group": {
... "_id": null,
... "AvgValue": {
... "$avg": "$Details.Price"
... }
... }
... }
... ]);
Kết quả
{ "_id" : null, "AvgValue" : 53.633333333333326 }
Giải thích:
"$Details.Price": Truy cập trường Price bên trong object Details_id: null: Nhóm tất cả document thành một nhóm duy nhất- Kết quả: (10.5 + 50.3 + 100.1) / 3 = 53.633...
Có thể kết hợp với $match để lọc trước khi tính trung bình, hoặc $group theo trường khác (ví dụ theo category) để tính trung bình theo nhóm.