MongoDB có $max
toán tử cho phép bạn cập nhật giá trị của trường chỉ khi giá trị được chỉ định lớn hơn giá trị hiện tại của trường.
Nói cách khác, nếu $max
giá trị lớn hơn giá trị hiện tại trong tài liệu, $max
giá trị được sử dụng. Nếu không, giá trị của tài liệu vẫn không thay đổi.
Ví dụ
Giả sử chúng ta có một bộ sưu tập như thế này:
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 230 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
Và hãy tưởng tượng rằng chúng tôi cập nhật bộ sưu tập sau mỗi buổi tập với các bài nâng mới nhất. Trong trường hợp này, chúng tôi chỉ muốn bestLift
trường sẽ được cập nhật nếu thang máy mới nhất của chúng tôi nặng hơn mức nâng tốt nhất trước đó của chúng tôi (tức là trọng lượng hiện tại được liệt kê cho thang máy tương ứng).
Trong trường hợp này, chúng tôi có thể sử dụng $max
để đạt được kết quả đó.
Ví dụ:
db.workout.update(
{ _id: 1 },
{ $max: { bestLift: 240 } }
)
Đầu ra:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Thông báo này cho chúng tôi biết rằng một tài liệu đã khớp và đã được cập nhật.
Hãy kiểm tra lại bộ sưu tập.
db.workout.find()
Kết quả:
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 240 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
Chúng ta có thể thấy rằng bestLift
trường cho tài liệu đầu tiên đã được cập nhật với giá trị mới. Điều này là do 240 cao hơn giá trị trước đó của nó là 230.
Khi giá trị thấp hơn
Khi giá trị được chỉ định bằng $max
thấp hơn giá trị hiện có trong tài liệu, không có gì được cập nhật.
Ví dụ:
db.workout.update(
{ _id: 1 },
{ $max: { bestLift: 220 } }
)
Đầu ra:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
Chúng tôi có thể thấy thông báo rằng không có gì được cập nhật.
Hãy kiểm tra lại bộ sưu tập.
db.workout.find()
Kết quả:
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 240 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
Chúng tôi có thể thấy rằng giá trị vẫn ở mức 240, mặc dù chúng tôi đã cố gắng cập nhật nó lên 220. Điều này được mong đợi, vì chúng tôi đã sử dụng $max
.
Ngày
Bạn có thể sử dụng $max
trên các trường ngày tháng.
Giả sử chúng ta có collection
được gọi là đăng ký với tài liệu sau:
{ "_id" : 1, "expiry" : ISODate("2021-01-01T00:00:00Z") }
Hãy cố gắng cập nhật ngày với một ngày sớm hơn ngày hiện tại trong tài liệu.
db.subscriptions.update(
{ _id: 1 },
{ $max: { expiry: new Date("2020-01-01") } }
)
Ở đây, chúng tôi cố gắng cập nhật năm từ 2021
đến 2020
. Do ngày mới sớm hơn ngày hiện có, chúng tôi nhận được thông tin sau.
db.subscriptions.find()
Kết quả:
{ "_id" : 1, "expiry" : ISODate("2021-01-01T00:00:00Z") }
Như mong đợi, không có gì được cập nhật.
Hãy cố gắng cập nhật nó vào một ngày sau đó.
db.subscriptions.update(
{ _id: 1 },
{ $max: { expiry: new Date("2022-01-01") } }
)
Đầu ra:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Chúng ta có thể thấy thông báo rằng tài liệu đã được cập nhật.
Hãy kiểm tra.
db.subscriptions.find()
Kết quả:
{ "_id" : 1, "expiry" : ISODate("2022-01-01T00:00:00Z") }
Ngày đã được cập nhật như dự kiến.