MongoDB ma $max
operator, który pozwala zaktualizować wartość pola tylko wtedy, gdy określona wartość jest większa niż bieżąca wartość pola.
Innymi słowy, jeśli $max
wartość jest większa niż bieżąca wartość w dokumencie, $max
używana jest wartość. W przeciwnym razie wartość dokumentu pozostaje niezmieniona.
Przykład
Załóżmy, że mamy taką kolekcję:
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 230 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
I wyobraź sobie, że aktualizujemy kolekcję po każdym treningu bez najnowszych wyciągów. W tym przypadku chcielibyśmy tylko bestLift
pole do zaktualizowania, jeśli nasz ostatni dźwig był cięższy niż nasz poprzedni najlepszy dźwig (tj. aktualna waga podana dla odpowiedniego dźwigu).
W tym przypadku możemy użyć $max
operatora, aby osiągnąć ten wynik.
Przykład:
db.workout.update(
{ _id: 1 },
{ $max: { bestLift: 240 } }
)
Wyjście:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Ta wiadomość informuje nas, że jeden dokument pasował i został zaktualizowany.
Sprawdźmy ponownie kolekcję.
db.workout.find()
Wynik:
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 240 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
Widzimy, że bestLift
pole dla pierwszego dokumentu zostało zaktualizowane o nową wartość. Dzieje się tak, ponieważ 240 jest wyższa niż poprzednia wartość 230.
Gdy wartość jest niższa
Gdy wartość określona w $max
jest niższa niż istniejąca wartość w dokumencie, nic nie jest aktualizowane.
Przykład:
db.workout.update(
{ _id: 1 },
{ $max: { bestLift: 220 } }
)
Wyjście:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
Widzimy komunikat, że nic nie zostało zaktualizowane.
Sprawdźmy ponownie kolekcję.
db.workout.find()
Wynik:
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 240 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
Widzimy, że wartość pozostaje na 240, mimo że próbowaliśmy zaktualizować ją do 220. Jest to oczekiwane, ponieważ użyliśmy $max
.
Daty
Możesz użyć $max
w polach daty.
Załóżmy, że mamy collection
zwane subskrypcjami z następującym dokumentem:
{ "_id" : 1, "expiry" : ISODate("2021-01-01T00:00:00Z") }
Spróbujmy zaktualizować datę o datę, która jest wcześniejsza niż bieżąca data w dokumencie.
db.subscriptions.update(
{ _id: 1 },
{ $max: { expiry: new Date("2020-01-01") } }
)
Tutaj staramy się zaktualizować rok od 2021
do 2020
. Biorąc pod uwagę, że nowa data jest wcześniejsza niż istniejąca, otrzymujemy następujące.
db.subscriptions.find()
Wynik:
{ "_id" : 1, "expiry" : ISODate("2021-01-01T00:00:00Z") }
Zgodnie z oczekiwaniami nic nie zostało zaktualizowane.
Spróbujmy zaktualizować go z późniejszą datą.
db.subscriptions.update(
{ _id: 1 },
{ $max: { expiry: new Date("2022-01-01") } }
)
Wyjście:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Widzimy komunikat, że dokument został zaktualizowany.
Sprawdźmy.
db.subscriptions.find()
Wynik:
{ "_id" : 1, "expiry" : ISODate("2022-01-01T00:00:00Z") }
Data została zaktualizowana zgodnie z oczekiwaniami.