MongoDB har en $max
operator, der kun tillader dig at opdatere værdien af et felt, hvis den angivne værdi er større end den aktuelle værdi af feltet.
Med andre ord, hvis $max
værdien er større end den aktuelle værdi i dokumentet, $max
værdi bruges. Ellers forbliver dokumentets værdi uændret.
Eksempel
Antag, at vi har en samling som denne:
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 230 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
Og forestil dig, at vi opdaterer kollektionen efter hver træning uden de seneste løft. I dette tilfælde vil vi kun have bestLift
felt, der skal opdateres, hvis vores seneste løft var tungere end vores tidligere bedste løft (dvs. den aktuelle vægt angivet for det respektive løft).
I dette tilfælde kunne vi bruge $max
operatør for at opnå dette resultat.
Eksempel:
db.workout.update(
{ _id: 1 },
{ $max: { bestLift: 240 } }
)
Output:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Denne meddelelse fortæller os, at et dokument matchede og blev opdateret.
Lad os tjekke samlingen igen.
db.workout.find()
Resultat:
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 240 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
Vi kan se, at bestLift
felt for det første dokument blev opdateret med den nye værdi. Dette skyldes, at 240 er højere end dens tidligere værdi på 230.
Når værdien er lavere
Når værdien er angivet med $max
er lavere end den eksisterende værdi i dokumentet, er intet opdateret.
Eksempel:
db.workout.update(
{ _id: 1 },
{ $max: { bestLift: 220 } }
)
Output:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
Vi kan se på beskeden, at intet blev opdateret.
Lad os tjekke samlingen igen.
db.workout.find()
Resultat:
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 240 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
Vi kan se, at værdien forbliver på 240, selvom vi forsøgte at opdatere den til 220. Dette forventes, fordi vi brugte $max
.
Datoer
Du kan bruge $max
på datofelter.
Antag, at vi har en collection
kaldede abonnementer med følgende dokument:
{ "_id" : 1, "expiry" : ISODate("2021-01-01T00:00:00Z") }
Lad os prøve at opdatere datoen med en dato, der er tidligere end den aktuelle dato i dokumentet.
db.subscriptions.update(
{ _id: 1 },
{ $max: { expiry: new Date("2020-01-01") } }
)
Her forsøger vi at opdatere året fra 2021
til 2020
. Da den nye dato er tidligere end den eksisterende, får vi følgende.
db.subscriptions.find()
Resultat:
{ "_id" : 1, "expiry" : ISODate("2021-01-01T00:00:00Z") }
Som forventet blev intet opdateret.
Lad os prøve at opdatere det med en senere dato.
db.subscriptions.update(
{ _id: 1 },
{ $max: { expiry: new Date("2022-01-01") } }
)
Output:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Vi kan se på meddelelsen, at dokumentet blev opdateret.
Lad os tjekke.
db.subscriptions.find()
Resultat:
{ "_id" : 1, "expiry" : ISODate("2022-01-01T00:00:00Z") }
Datoen blev opdateret som forventet.