MongoDB har en $max
operator som låter dig uppdatera värdet för ett fält endast om det angivna värdet är större än det aktuella värdet för fältet.
Med andra ord, om $max
värdet är större än det aktuella värdet i dokumentet, $max
värde används. Annars förblir dokumentets värde oförändrat.
Exempel
Anta att vi har en sådan här samling:
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 230 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
Och tänk dig att vi uppdaterar kollektionen efter varje träningspass med de senaste lyften. I det här fallet vill vi bara ha bestLift
fältet som ska uppdateras om vårt senaste lyft var tyngre än vårt tidigare bästa lyft (dvs. den aktuella vikten som anges för respektive lyft).
I det här fallet kan vi använda $max
operatör för att uppnå detta resultat.
Exempel:
db.workout.update(
{ _id: 1 },
{ $max: { bestLift: 240 } }
)
Utdata:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Detta meddelande berättar att ett dokument matchade och uppdaterades.
Låt oss kolla in 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 att bestLift
fältet för det första dokumentet uppdaterades med det nya värdet. Detta beror på att 240 är högre än dess tidigare värde på 230.
När värdet är lägre
När värdet anges med $max
är lägre än det befintliga värdet i dokumentet uppdateras ingenting.
Exempel:
db.workout.update(
{ _id: 1 },
{ $max: { bestLift: 220 } }
)
Utdata:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
Vi kan se på meddelandet att ingenting har uppdaterats.
Låt oss kolla in 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 att värdet ligger kvar på 240, även om vi försökte uppdatera det till 220. Detta förväntas eftersom vi använde $max
.
Datum
Du kan använda $max
på datumfält.
Anta att vi har en collection
anropade prenumerationer med följande dokument:
{ "_id" : 1, "expiry" : ISODate("2021-01-01T00:00:00Z") }
Låt oss försöka uppdatera datumet med ett datum som är tidigare än det aktuella datumet i dokumentet.
db.subscriptions.update(
{ _id: 1 },
{ $max: { expiry: new Date("2020-01-01") } }
)
Här försöker vi uppdatera årtalet från 2021
till 2020
. Med tanke på att det nya datumet är tidigare än det befintliga får vi följande.
db.subscriptions.find()
Resultat:
{ "_id" : 1, "expiry" : ISODate("2021-01-01T00:00:00Z") }
Som väntat uppdaterades ingenting.
Låt oss försöka uppdatera den med ett senare datum.
db.subscriptions.update(
{ _id: 1 },
{ $max: { expiry: new Date("2022-01-01") } }
)
Utdata:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Vi kan se på meddelandet att dokumentet har uppdaterats.
Låt oss kolla.
db.subscriptions.find()
Resultat:
{ "_id" : 1, "expiry" : ISODate("2022-01-01T00:00:00Z") }
Datumet uppdaterades som förväntat.