MongoDB ha un $max
operatore che consente di aggiornare il valore di un campo solo se il valore specificato è maggiore del valore corrente del campo.
In altre parole, se il $max
value è maggiore del valore corrente nel documento, il $max
viene utilizzato il valore. In caso contrario, il valore del documento rimane invariato.
Esempio
Supponiamo di avere una raccolta come questa:
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 230 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
E immagina di aggiornare la collezione dopo ogni allenamento senza gli ultimi sollevamenti. In questo caso, vorremmo solo il bestLift
campo da aggiornare se il nostro ultimo sollevamento è stato più pesante del nostro migliore sollevamento precedente (ovvero il peso corrente elencato per il rispettivo sollevamento).
In questo caso potremmo usare il $max
operatore per raggiungere tale risultato.
Esempio:
db.workout.update(
{ _id: 1 },
{ $max: { bestLift: 240 } }
)
Uscita:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Questo messaggio ci dice che un documento corrisponde ed è stato aggiornato.
Controlliamo di nuovo la collezione.
db.workout.find()
Risultato:
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 240 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
Possiamo vedere che il bestLift
il campo del primo documento è stato aggiornato con il nuovo valore. Questo perché 240 è superiore al suo valore precedente di 230.
Quando il valore è inferiore
Quando il valore specificato con $max
è inferiore al valore esistente nel documento, non viene aggiornato nulla.
Esempio:
db.workout.update(
{ _id: 1 },
{ $max: { bestLift: 220 } }
)
Uscita:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
Possiamo vedere dal messaggio che non è stato aggiornato nulla.
Controlliamo di nuovo la collezione.
db.workout.find()
Risultato:
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 240 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
Possiamo vedere che il valore rimane a 240, anche se abbiamo provato ad aggiornarlo a 220. Questo è previsto, perché abbiamo usato $max
.
Date
Puoi usare $max
nei campi della data.
Supponiamo di avere una collection
chiamate sottoscrizioni con il seguente documento:
{ "_id" : 1, "expiry" : ISODate("2021-01-01T00:00:00Z") }
Proviamo ad aggiornare la data con una data anteriore alla data corrente nel documento.
db.subscriptions.update(
{ _id: 1 },
{ $max: { expiry: new Date("2020-01-01") } }
)
Qui, proviamo ad aggiornare l'anno da 2021
a 2020
. Dato che la nuova data è precedente a quella esistente, otteniamo quanto segue.
db.subscriptions.find()
Risultato:
{ "_id" : 1, "expiry" : ISODate("2021-01-01T00:00:00Z") }
Come previsto, nulla è stato aggiornato.
Proviamo ad aggiornarlo con una data successiva.
db.subscriptions.update(
{ _id: 1 },
{ $max: { expiry: new Date("2022-01-01") } }
)
Uscita:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Possiamo vedere dal messaggio che il documento è stato aggiornato.
Controlliamo.
db.subscriptions.find()
Risultato:
{ "_id" : 1, "expiry" : ISODate("2022-01-01T00:00:00Z") }
La data è stata aggiornata come previsto.