Trong MongoDB, $min
toán tử đường ống tổng hợp trả về giá trị nhỏ nhất từ một biểu thức.
Cú pháp
$min
toán tử hỗ trợ hai cú pháp.
Cú pháp 1:
{ $min: <expression> }
Cú pháp 2:
{ $min: [ <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, $min
trả về giá trị nhỏ 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 $min
kết hợp với $group
để trả về giá trị tối thiểu 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 $min
để trả về giá trị nhỏ nhất của weight
trường cho mỗi nhóm:
db.pets.aggregate(
[
{
$group:
{
_id: "$type",
min: { $min: "$weight" }
}
}
]
)
Kết quả:
{"_id":"Kangaroo", "min":100} {"_id":"Dog", "min":10} {"_id":"Cat", "min":7}Mảng
Ví dụ này áp dụng
$min
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
$min
đến điểmscores
trường trong mỗi tài liệu:db.players.aggregate( [ { $project: { player: 1, min: { $min: "$scores" } } } ] )
Kết quả:
{"_id":1, "player":"Homer", "min":1} {"_id":2, "player":"Marge", "min":0} {"_id":3, "player":"Bart", "min":0} {"_id":4, "player":"Brian", "min":7} {"_id":5, "player":"Farnsworth "," min ":null} {" _id ":6," player ":" Meg "," min ":null} {" _id ":7," player ":" Ron "," min ":null}Trong trường hợp này, bốn tài liệu đầu tiên trả về giá trị nhỏ 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
$min
với nhiều hơn một đối số.$min
sau đó trả về giá trị nhỏ 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
$min
để trả về giá trị nhỏ nhất từ a
,b
,c
vàd
lĩnh vực:db.data.aggregate( [ { $match: { _id: { $in: [ 1 ] } } }, { $project: { min: { $min: [ "$a", "$b", "$c", "$d" ] } } } ] )
Kết quả:
{"_id":1, "min":-900}Trong trường hợp này,
-900
là giá trị tối thiểu.Các trường bị thiếu
Khi sử dụng cú pháp nhiều đối số,
$min
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: { min: { $min: [ "$a", "$b", "$c", "$d", "$e" ] } } } ] )
Kết quả:
{"_id":1, "min":-900}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.$min
đã tính giá trị tối thiểu 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: { $min: [ "$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", min: { $min: "$oops!" } } } ] )
Kết quả:
{"_id":"Dog", "min":null} {"_id":"Cat", "min":null} {"_id":"Kangaroo", "min":null}So sánh các loại khác nhau
$min
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,$min
tính toán giá trị tối thiểu 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":[0]} {"_id":3, "a":1, " b ":2," c ":3," d ":" 0 "} {" _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
$min
đối với các tài liệu đó:db.data.aggregate( [ { $match: { _id: { $in: [ 2, 3, 4, 5, 6 ] } } }, { $project: { min: { $min: [ "$a", "$b", "$c", "$d" ] } } } ] )
Kết quả:
{"_id":2, "min":1} {"_id":3, "min":1} {"_id":4, "min":"Four"} {"_id":5 , "min":ISODate ("1999-01-03T23:30:15.100Z")} {"_id":6, "min":"2000-01-03T23:30:15.100Z"}Về tài liệu có
_id
trong tổng số2
, số nhỏ hơn mảng, vì vậy số1
được trả về (mặc dù mảng chứa một số nhỏ hơn tất cả các số khác).Tài liệu 3:Các số nhỏ hơn chuỗi và do đó, số thấp nhất được trả về.
Tài liệu 4:Tất cả các trường đều là chuỗi, và vì vậy
Four
là chuỗi tối thiểu.Tài liệu 5:Hai ngày được cung cấp và do đó ngày trước đó đượ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. Chuỗi ít hơn đối tượng Ngày, và do đó, chuỗi được trả về (ngay cả khi ngày của nó muộn hơn đối tượng Ngày).
Các giai đoạn có sẵn
$min
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