MongoDB má $max
operátor, který umožňuje aktualizovat hodnotu pole pouze v případě, že je zadaná hodnota větší než aktuální hodnota pole.
Jinými slovy, pokud $max
hodnota je větší než aktuální hodnota v dokumentu, $max
je použita hodnota. Jinak zůstane hodnota dokumentu nezměněna.
Příklad
Předpokládejme, že máme sbírku jako je tato:
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 230 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
A představte si, že po každém tréninku aktualizujeme kolekci nejnovějšími cviky. V tomto případě bychom chtěli pouze bestLift
pole, které bude aktualizováno, pokud byl náš poslední výtah těžší než náš předchozí nejlepší výtah (tj. aktuální hmotnost uvedená pro příslušný výtah).
V tomto případě bychom mohli použít $max
operátora k dosažení tohoto výsledku.
Příklad:
db.workout.update(
{ _id: 1 },
{ $max: { bestLift: 240 } }
)
Výstup:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Tato zpráva nám říká, že jeden dokument se shodoval a byl aktualizován.
Podívejme se znovu na sbírku.
db.workout.find()
Výsledek:
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 240 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
Vidíme, že bestLift
pole pro první dokument bylo aktualizováno novou hodnotou. Je to proto, že 240 je vyšší než jeho předchozí hodnota 230.
Když je hodnota nižší
Když je hodnota zadaná pomocí $max
je nižší než stávající hodnota v dokumentu, nic se neaktualizuje.
Příklad:
db.workout.update(
{ _id: 1 },
{ $max: { bestLift: 220 } }
)
Výstup:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
Podle zprávy vidíme, že nebylo nic aktualizováno.
Podívejme se znovu na sbírku.
db.workout.find()
Výsledek:
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 240 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
Vidíme, že hodnota zůstává na 240, i když jsme se ji pokusili aktualizovat na 220. To se očekává, protože jsme použili $max
.
Data
Můžete použít $max
v datech.
Předpokládejme, že máme collection
volal předplatné s následujícím dokumentem:
{ "_id" : 1, "expiry" : ISODate("2021-01-01T00:00:00Z") }
Zkusme aktualizovat datum datem, které je dřívější než aktuální datum v dokumentu.
db.subscriptions.update(
{ _id: 1 },
{ $max: { expiry: new Date("2020-01-01") } }
)
Zde se snažíme aktualizovat rok z 2021
do 2020
. Vzhledem k tomu, že nové datum je dřívější než stávající, dostáváme následující.
db.subscriptions.find()
Výsledek:
{ "_id" : 1, "expiry" : ISODate("2021-01-01T00:00:00Z") }
Podle očekávání nebylo nic aktualizováno.
Zkusme to aktualizovat na pozdější datum.
db.subscriptions.update(
{ _id: 1 },
{ $max: { expiry: new Date("2022-01-01") } }
)
Výstup:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Podle zprávy vidíme, že dokument byl aktualizován.
Zkontrolujeme.
db.subscriptions.find()
Výsledek:
{ "_id" : 1, "expiry" : ISODate("2022-01-01T00:00:00Z") }
Datum bylo aktualizováno podle očekávání.