MongoDB heeft een $max
operator waarmee u de waarde van een veld alleen kunt bijwerken als de opgegeven waarde groter is dan de huidige waarde van het veld.
Met andere woorden, als de $max
waarde groter is dan de huidige waarde in het document, de $max
waarde wordt gebruikt. Anders blijft de waarde van het document ongewijzigd.
Voorbeeld
Stel dat we een collectie hebben zoals deze:
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 230 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
En stel je voor dat we de collectie na elke training bijwerken met de nieuwste liften. In dit geval willen we alleen de bestLift
veld dat moet worden bijgewerkt als onze laatste lift zwaarder was dan onze vorige beste lift (d.w.z. het huidige gewicht dat wordt vermeld voor de respectieve lift).
In dit geval zouden we de $max
. kunnen gebruiken operator om dat resultaat te bereiken.
Voorbeeld:
db.workout.update(
{ _id: 1 },
{ $max: { bestLift: 240 } }
)
Uitgang:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Dit bericht vertelt ons dat één document overeenkomt en is bijgewerkt.
Laten we de collectie nog eens bekijken.
db.workout.find()
Resultaat:
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 240 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
We kunnen zien dat de bestLift
veld voor het eerste document is bijgewerkt met de nieuwe waarde. Dit komt omdat 240 hoger is dan de vorige waarde van 230.
Als de waarde lager is
Wanneer de waarde gespecificeerd met $max
lager is dan de bestaande waarde in het document, wordt er niets bijgewerkt.
Voorbeeld:
db.workout.update(
{ _id: 1 },
{ $max: { bestLift: 220 } }
)
Uitgang:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
We kunnen aan het bericht zien dat er niets is bijgewerkt.
Laten we de collectie nog eens bekijken.
db.workout.find()
Resultaat:
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 240 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
We kunnen zien dat de waarde op 240 blijft, ook al hebben we geprobeerd deze bij te werken naar 220. Dit is te verwachten, omdat we $max
hebben gebruikt .
Datums
U kunt $max
. gebruiken op datumvelden.
Stel we hebben een collection
opgeroepen abonnementen met het volgende document:
{ "_id" : 1, "expiry" : ISODate("2021-01-01T00:00:00Z") }
Laten we proberen de datum bij te werken met een datum die eerder is dan de huidige datum in het document.
db.subscriptions.update(
{ _id: 1 },
{ $max: { expiry: new Date("2020-01-01") } }
)
Hier proberen we het jaar bij te werken vanaf 2021
tot 2020
. Aangezien de nieuwe datum eerder is dan de bestaande, krijgen we het volgende.
db.subscriptions.find()
Resultaat:
{ "_id" : 1, "expiry" : ISODate("2021-01-01T00:00:00Z") }
Zoals verwacht is er niets bijgewerkt.
Laten we proberen het op een later tijdstip bij te werken.
db.subscriptions.update(
{ _id: 1 },
{ $max: { expiry: new Date("2022-01-01") } }
)
Uitgang:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
We kunnen aan het bericht zien dat het document is bijgewerkt.
Laten we eens kijken.
db.subscriptions.find()
Resultaat:
{ "_id" : 1, "expiry" : ISODate("2022-01-01T00:00:00Z") }
De datum is bijgewerkt zoals verwacht.