sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB $máx.

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.