Để tìm giá trị số (numeric) lớn nhất của một cột/trường trong MongoDB, khi cột có thể chứa cả số và chuỗi (string), bạn sử dụng $not kết hợp $type để lọc chỉ kiểu số, sau đó sắp xếp giảm dần và limit 1.
Tạo dữ liệu mẫu
Trường StudentMathMarks chứa lẫn số (number) và chuỗi (string): 69 (số), "89" (chuỗi), 82 (số), "100" (chuỗi).
Hiển thị tất cả:
{ "_id" : ObjectId("5cba05727219729fde21ddb1"), "StudentName" : "John", "StudentMathMarks" : 69 } { "_id" : ObjectId("5cba059d7219729fde21ddb2"), "StudentName" : "Carol", "StudentMathMarks" : "89" } { "_id" : ObjectId("5cba059d7219729fde21ddb3"), "StudentName" : "Chris", "StudentMathMarks" : 82 } { "_id" : ObjectId("5cba059d7219729fde21ddb4"), "StudentName" : "John", "StudentMathMarks" : "100" }Tìm giá trị SỐ lớn nhất (bỏ qua chuỗi)
{ "_id" : ObjectId("5cba059d7219729fde21ddb3"), "StudentName" : "Chris", "StudentMathMarks" : 82 }Giải thích
$type: 2- Kiểu String (xem BSON types: 1=Double, 2=String, 3=Object, 16=Int32, 18=Int64){$not: {$type: 2}}- Không phải kiểu String (chỉ giữ number: Double, Int32, Int64).sort({StudentMathMarks: -1})- Sắp xếp giảm dần.limit(1)- Lấy 1 document đầu (giá trị số lớn nhất)
Kết quả 82 (số) lớn hơn 69 (số). Các giá trị "89" và "100" là chuỗi bị loại bỏ.
Cách tốt hơn (Aggregation): Dùng $convert hoặc $toDouble để chuẩn hóa kiểu trước khi so sánh.