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.