MongoDB Aggregation Framework cung cấp các toán tử $max và $min để tính giá trị lớn nhất và nhỏ nhất của một trường trên toàn bộ collection (hoặc theo nhóm).
Tạo dữ liệu mẫu
> db.maxAndMinDemo.insertOne({"Value":98});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd698a357806ebf1256f129") }
> db.maxAndMinDemo.insertOne({"Value":97});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd698af57806ebf1256f12a") }
> db.maxAndMinDemo.insertOne({"Value":69});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd698b357806ebf1256f12b") }
> db.maxAndMinDemo.insertOne({"Value":96});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd698b657806ebf1256f12c") }
> db.maxAndMinDemo.insertOne({"Value":99});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd698b957806ebf1256f12d") }
Xem dữ liệu
> db.maxAndMinDemo.find().pretty();
Truy vấn Max và Min cùng lúc
> db.maxAndMinDemo.aggregate([ { "$group": { "_id": null, "MaximumValue": { "$max": "$Value" }, "MinimumValue": { "$min": "$Value" } }} ]);Kết quả
Giải thích
_id: null: Nhóm tất cả tài liệu thành một nhóm duy nhất (không nhóm theo trường nào)$max: "$Value": Tìm giá trị lớn nhất của trường Value$min: "$Value": Tìm giá trị nhỏ nhất của trường Value- Kết quả trả về 1 tài liệu duy nhất chứa cả Max và Min
Các biến thể
Chỉ lấy Max
db.maxAndMinDemo.aggregate([{$group: {_id: null, MaxValue: {$max: "$Value"}}});
Nhóm theo loại (Category) rồi lấy Max/Min mỗi nhóm
db.maxAndMinDemo.aggregate([
{$group: {_id: "$Category", MaxValue: {$max: "$Value"}, MinValue: {$min: "$Value"}}}
]);
Lấy cả tài liệu có giá trị Max/Min (không chỉ giá trị)
// Max
db.maxAndMinDemo.find().sort({Value: -1}).limit(1);
// Min
db.maxAndMinDemo.find().sort({Value: 1}).limit(1);
Toán tử thống kê khác trong $group
| Toán tử | Mô tả |
|---|---|
$sum | Tổng cộng |
$avg | Trung bình cộng |
$first | Giá trị đầu tiên (cần $sort trước) |
$last | Giá trị cuối cùng (cần $sort trước) |
$stdDevPop | Độ lệch chuẩn tổng thể |
$stdDevSamp | Độ lệch chuẩn mẫu |
Lưu ý
- Trường phải là kiểu số (number) để $max/$min hoạt động chính xác
- Null/missing values bị bỏ qua trong tính toán
- Tạo index trên trường Value để tối ưu:
db.maxAndMinDemo.createIndex({Value: 1})