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

Lấy giá trị lớn nhất và nhỏ nhất trong MongoDB

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ả
$sumTổng cộng
$avgTrung bình cộng
$firstGiá trị đầu tiên (cần $sort trước)
$lastGiá 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})