MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB $max


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.