MongoDB tiene un $max
operador que le permite actualizar el valor de un campo solo si el valor especificado es mayor que el valor actual del campo.
En otras palabras, si el $max
valor es mayor que el valor actual en el documento, el $max
se utiliza el valor. De lo contrario, el valor del documento permanece sin cambios.
Ejemplo
Supongamos que tenemos una colección como esta:
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 230 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
E imagina que actualizamos la colección después de cada entrenamiento sin los últimos levantamientos. En este caso, solo querríamos el bestLift
campo que se actualizará si nuestro último levantamiento fue más pesado que nuestro mejor levantamiento anterior (es decir, el peso actual indicado para el levantamiento respectivo).
En este caso podríamos usar el $max
operador para lograr ese resultado.
Ejemplo:
db.workout.update(
{ _id: 1 },
{ $max: { bestLift: 240 } }
)
Salida:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Este mensaje nos dice que un documento coincidió y se actualizó.
Revisemos la colección nuevamente.
db.workout.find()
Resultado:
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 240 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
Podemos ver que el bestLift
El campo del primer documento se actualizó con el nuevo valor. Esto se debe a que 240 es más alto que su valor anterior de 230.
Cuando el valor es más bajo
Cuando el valor especificado con $max
es inferior al valor existente en el documento, no se actualiza nada.
Ejemplo:
db.workout.update(
{ _id: 1 },
{ $max: { bestLift: 220 } }
)
Salida:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
Podemos ver por el mensaje que no se actualizó nada.
Revisemos la colección nuevamente.
db.workout.find()
Resultado:
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 240 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
Podemos ver que el valor permanece en 240, aunque intentamos actualizarlo a 220. Esto era de esperar, porque usamos $max
.
Fechas
Puedes usar $max
en los campos de fecha.
Supongamos que tenemos una collection
llamadas suscripciones con el siguiente documento:
{ "_id" : 1, "expiry" : ISODate("2021-01-01T00:00:00Z") }
Intentemos actualizar la fecha con una fecha anterior a la fecha actual del documento.
db.subscriptions.update(
{ _id: 1 },
{ $max: { expiry: new Date("2020-01-01") } }
)
Aquí, intentamos actualizar el año desde 2021
a 2020
. Dado que la nueva fecha es anterior a la existente, obtenemos lo siguiente.
db.subscriptions.find()
Resultado:
{ "_id" : 1, "expiry" : ISODate("2021-01-01T00:00:00Z") }
Como era de esperar, no se actualizó nada.
Intentemos actualizarlo con una fecha posterior.
db.subscriptions.update(
{ _id: 1 },
{ $max: { expiry: new Date("2022-01-01") } }
)
Salida:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Podemos ver por el mensaje que el documento fue actualizado.
Vamos a comprobar.
db.subscriptions.find()
Resultado:
{ "_id" : 1, "expiry" : ISODate("2022-01-01T00:00:00Z") }
La fecha se actualizó como se esperaba.