MongoDB tem um
$max
operador que permite atualizar o valor de um campo somente se o valor especificado for maior que o valor atual do campo. Em outras palavras, se o
$max
valor for maior que o valor atual no documento, o $max
valor é usado. Caso contrário, o valor do documento permanece inalterado. Exemplo
Suponha que tenhamos uma coleção como esta:
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 230 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
E imagine que atualizamos a coleção após cada treino com os últimos levantamentos. Nesse caso, gostaríamos apenas do
bestLift
campo a ser atualizado se nosso último levantamento for mais pesado do que nosso melhor levantamento anterior (ou seja, o peso atual listado para o respectivo levantamento). Neste caso, poderíamos usar o
$max
operador para alcançar esse resultado. Exemplo:
db.workout.update(
{ _id: 1 },
{ $max: { bestLift: 240 } }
)
Saída:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Esta mensagem nos informa que um documento correspondeu e foi atualizado.
Vamos verificar a coleção novamente.
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 o
bestLift
campo para o primeiro documento foi atualizado com o novo valor. Isso ocorre porque 240 é maior que seu valor anterior de 230. Quando o valor é menor
Quando o valor especificado com
$max
for menor que o valor existente no documento, nada é atualizado. Exemplo:
db.workout.update(
{ _id: 1 },
{ $max: { bestLift: 220 } }
)
Saída:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
Podemos ver pela mensagem que nada foi atualizado.
Vamos verificar a coleção novamente.
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 o valor permanece em 240, embora tenhamos tentado atualizá-lo para 220. Isso é esperado, pois usamos
$max
. Datas
Você pode usar
$max
nos campos de data. Suponha que temos uma
collection
chamadas de assinaturas com o seguinte documento:{ "_id" : 1, "expiry" : ISODate("2021-01-01T00:00:00Z") }
Vamos tentar atualizar a data com uma data anterior à data atual no documento.
db.subscriptions.update(
{ _id: 1 },
{ $max: { expiry: new Date("2020-01-01") } }
)
Aqui, tentamos atualizar o ano de
2021
para 2020
. Dado que a nova data é anterior à existente, obtemos o seguinte. db.subscriptions.find()
Resultado:
{ "_id" : 1, "expiry" : ISODate("2021-01-01T00:00:00Z") }
Como esperado, nada foi atualizado.
Vamos tentar atualizá-lo com uma data posterior.
db.subscriptions.update(
{ _id: 1 },
{ $max: { expiry: new Date("2022-01-01") } }
)
Saída:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Podemos ver pela mensagem que o documento foi atualizado.
Vamos checar.
db.subscriptions.find()
Resultado:
{ "_id" : 1, "expiry" : ISODate("2022-01-01T00:00:00Z") }
A data foi atualizada conforme o esperado.