Trong MongoDB, $max
toán tử đường ống tổng hợp trả về giá trị lớn nhất từ một biểu thức.
Cú pháp
$max
toán tử hỗ trợ hai cú pháp.
Cú pháp 1:
{ $max: <expression> }
Cú pháp 2:
{ $max: [ <expression1>, <expression2> ... ] }
Cú pháp đầu tiên chấp nhận một đối số và cú pháp thứ hai chấp nhận nhiều đối số.
Khi được sử dụng trong nhóm $group
giai đoạn này, bạn chỉ có thể sử dụng cú pháp đầu tiên. Trong trường hợp này, $max
trả về giá trị lớn nhất là kết quả của việc áp dụng một biểu thức cho từng tài liệu trong một nhóm tài liệu chia sẻ cùng một nhóm theo khóa.
Ví dụ về Cú pháp 1 (Đối số Đơn)
Dưới đây là một số ví dụ sử dụng cú pháp đối số duy nhất.
Tài liệu được Nhóm
Ví dụ này sử dụng $max
kết hợp với $group
để trả về giá trị lớn nhất từ một nhóm tài liệu được nhóm theo khóa.
Giả sử chúng ta có một bộ sưu tập có tên là pets
với các tài liệu sau:
{"_id":1, "name":"Wag", "type":"Dog", "weight":20} {"_id":2, "name":"Bark", "type" :"Dog", "weight":10} {"_id":3, "name":"Meo meo", "type":"Cat", "weight":7} {"_id":4, "name" :"Scratch", "type":"Cat", "weight":8} {"_id":5, "name":"Bruce", "type":"Kangaroo", "weight":100} {" _id ":6," name ":" Hop "," type ":" Kangaroo "," weight ":130} {" _id ":7," name ":" Punch "," type ":" Kangaroo ", "weight":200} {"_id":8, "name":"Snap", "type":"Cat", "weight":12} {"_id":9, "name":"Ruff", "type":"Dog", "weight":30}
Chúng tôi có thể nhóm các tài liệu này theo type
của chúng và sau đó sử dụng $max
để trả về giá trị lớn nhất của weight
trường cho mỗi nhóm:
db.pets.aggregate(
[
{
$group:
{
_id: "$type",
max: { $max: "$weight" }
}
}
]
)
Kết quả:
{"_id":"Kangaroo", "max":200} {"_id":"Cat", "max":12} {"_id":"Dog", "max":30}Mảng
Ví dụ này áp dụng
$max
vào một tài liệu duy nhất có chứa một trường với một mảng giá trị.Tùy chọn này chỉ khả dụng khi sử dụng cú pháp đối số duy nhất. Mảng bị bỏ qua khi sử dụng cú pháp nhiều đối số (thông tin thêm về điều này bên dưới).
Giả sử chúng ta có một bộ sưu tập có tên là
players
với các tài liệu sau:{"_id":1, "player":"Homer", "score":[1, 7, 2, 3, 8, 7, 1]} {"_id":2, "player":" Marge "," điểm ":[0, 1, 8, 17, 18, 8]} {" _id ":3," player ":" Bart "," score ":[15, 11, 8, 0, 1 , 3]} {"_id":4, "player":"Brian", "Score":[7]} {"_id":5, "player":"Farnsworth", "Score":[]} { "_id":6, "player":"Meg", "score":null} {"_id":7, "player":"Ron"}Chúng tôi có thể áp dụng
$max
đến điểmscores
trường trong mỗi tài liệu:db.players.aggregate( [ { $project: { player: 1, max: { $max: "$scores" } } } ] )
Kết quả:
{"_id":1, "player":"Homer", "max":8} {"_id":2, "player":"Marge", "max":18} {"_id":3, "player":"Bart", "max":15} {"_id":4, "player":"Brian", "max":7} {"_id":5, "player":"Farnsworth "," max ":null} {" _id ":6," player ":" Meg "," max ":null} {" _id ":7," player ":" Ron "," max ":null}Trong trường hợp này, bốn tài liệu đầu tiên trả về giá trị lớn nhất từ các số khác nhau trong các mảng tương ứng của chúng.
Trong trường hợp của tài liệu 4, số này giống với số vì chỉ có một số trong mảng.
Tài liệu 5 được trả về
null
vì chúng tôi đã cung cấp một mảng trống.Tài liệu 6 trả về
null
bởi vì chúng tôi đã cung cấpnull
như đối số.Tài liệu 7 trả về
null
bởi vì trường thậm chí không tồn tại.Ví dụ về Cú pháp 2 (Nhiều đối số)
Cú pháp thứ hai liên quan đến việc cung cấp
$max
với nhiều hơn một đối số.$max
sau đó trả về giá trị lớn nhất từ tất cả các đối số được cung cấp.Giả sử chúng ta có một tập hợp được gọi là
data
với tài liệu sau:{"_id":1, "a":10, "b":500, "c":-900, "d":4}Chúng tôi có thể sử dụng
$max
để trả về giá trị lớn nhất từ a
,b
,c
vàd
lĩnh vực:db.data.aggregate( [ { $match: { _id: { $in: [ 1 ] } } }, { $project: { max: { $max: [ "$a", "$b", "$c", "$d" ] } } } ] )
Kết quả:
{"_id":1, "max":500}Trong trường hợp này,
500
là giá trị lớn nhất.Các trường bị thiếu
Khi sử dụng cú pháp nhiều đối số,
$max
bỏ qua bất kỳ trường nào bị thiếu. Có nghĩa là, nếu bạn cung cấp một trường không tồn tại, nó sẽ bỏ qua nó. Nếu không có trường nào tồn tại, thì nó trả vềnull
.Ví dụ:
db.data.aggregate( [ { $match: { _id: { $in: [ 1 ] } } }, { $project: { max: { $max: [ "$a", "$b", "$c", "$d", "$e" ] } } } ] )
Kết quả:
{"_id":1, "max":500}Trong trường hợp này, tôi đã cung cấp thêm một trường (
$e
) không tồn tại trong tài liệu.$max
đã tính giá trị lớn nhất dựa trên các trường còn lại do tồn tại.Tuy nhiên, đây là những gì sẽ xảy ra khi không có trong số các trường tồn tại:
db.data.aggregate( [ { $match: { _id: { $in: [ 1 ] } } }, { $project: { result: { $max: [ "$x", "$y", "$z" ] } } } ] )
Kết quả:
{"_id":1, "kết quả":null}Kết quả là
null
.Như chúng ta đã thấy trước đó, khi sử dụng cú pháp một đối số, một trường bị thiếu dẫn đến
null
.Ví dụ:
db.pets.aggregate( [ { $group: { _id: "$type", max: { $max: "$oops!" } } } ] )
Kết quả:
{"_id":"Dog", "max":null} {"_id":"Kangaroo", "max":null} {"_id":"Cat", "max":null}So sánh các loại khác nhau
$max
toán tử so sánh cả giá trị và kiểu. Khi các giá trị thuộc các loại khác nhau,$max
tính toán giá trị lớn nhất dựa trên thứ tự so sánh BSON.Giả sử bộ sưu tập của chúng tôi chứa các tài liệu sau:
{"_id":2, "a":1, "b":2, "c":3, "d":[1]} {"_id":3, "a":1, " b ":2," c ":3," d ":" 1 "} {" _id ":4," a ":" Một "," b ":" Hai "," c ":" Ba ", "d":"Four"} {"_id":5, "a":ISODate ("1999-01-03T23:30:15.100Z"), "b":ISODate ("2000-01-03T23:30:15.100Z ")} {" _id ":6," a ":ISODate (" 1999-01-03T23:30:15.100Z ")," b ":" 2000-01-03T23:30:15.100Z "}Ngoại trừ tài liệu 4, mỗi tài liệu đó sử dụng các loại hỗn hợp (có ít nhất một loại khác với các loại khác trên các trường dữ liệu). Tài liệu 4 sử dụng các chuỗi trong cả bốn trường.
Đây là những gì sẽ xảy ra khi chúng tôi áp dụng
$max
đối với các tài liệu đó:db.data.aggregate( [ { $match: { _id: { $in: [ 2, 3, 4, 5, 6 ] } } }, { $project: { max: { $max: [ "$a", "$b", "$c", "$d" ] } } } ] )
Kết quả:
{"_id":2, "max":[1]} {"_id":3, "max":"1"} {"_id":4, "max":"Hai"} {" _id ":5," max ":ISODate (" 2000-01-03T23:30:15.100Z ")} {" _id ":6," max ":ISODate (" 1999-01-03T23:30:15.100Z " )}tài liệu có
_id
trong tổng số2
, mảng lớn hơn số, do đó, mảng được trả về (ngay cả khi phần tử của nó là một số nhỏ hơn một số các số khác).Tài liệu 3:Chuỗi lớn hơn số và do đó, chuỗi được trả về.
Tài liệu 4:Tất cả các trường đều là chuỗi, và vì vậy
Two
là chuỗi lớn nhất.Tài liệu 5:Hai ngày được cung cấp và do đó, ngày sau đó sẽ được trả lại.
Tài liệu 6:Trong trường hợp này, một đối tượng Ngày và một chuỗi ngày được cung cấp. Đối tượng ngày lớn hơn chuỗi và do đó đối tượng Ngày được trả về (ngay cả khi ngày của nó sớm hơn ngày của chuỗi).
Các giai đoạn có sẵn
$max
có sẵn trong các giai đoạn sau:
-
$group
-
$project
-
$addFields
-
$set
-
$replaceRoot
-
$replaceWith
-
$match
giai đoạn bao gồm$expr
biểu hiện