MongoDB - Updates Simples
Tags: mongodb, beginners, braziliandevs
Published: 2022-07-22 14:01:27

## Tabela de Conteúdo

- [`updateOne()`](#updateone)
- [`updateMany()`](#updatemany)
- [Operador `$set`](#operador-set)
- [Operador `$mul`](#operador-mul)
- [Operador `$inc`](#operador-inc)
- [Operadores `$min` e `$max`](#operadores-min-e-max)
- [Operador `$currentDate`](#operador-currentdate)
- [Operador `$rename`](#operador-rename)
- [Operador `$unset`](#operador-unset)
- [Links Úteis](#links-úteis)

---

## updateOne()

### O que é?

É um método do MongoDB que nos permite atualizar um único Documento dentro de uma coleção, mesmo que não passemos um filtro o método irá atualizar apenas um Documento.

### Sintaxe

O `updateOne()` pode receber até três parâmetros, sendo os dois primeiros obrigatórios, são eles: um filtro; o _"update"_ em si; e ao final opções para o update.

O filtro consiste em uma condição para que possamos achar o Documento a ser atualizado, nele podemos construir uma expressão de verificação utilizando qualquer um dos Operadores de Comparação/Lógicos vistos anteriormente.

Já o _"update"_ são os campos com os novos dados a serem inseridos no Documento, nele podemos atualizar todos os campos ou apenas um. Enquanto as opções são configurações extras e opcionais que podemos fazer em nosso `updateOne()`, como definir as regras de comparação de `strings`, por exemplo.

``` bash
db.<coleção>.updateOne(
  { <filtro> },
  { <update> },
  { <opções> }  # opcional
);
```

``` bash
db.my-collection.updateOne(
  { name: "Gabriel" },
  { $set: { age: 22 } }  # o operador $set será abordado mais a frente
)
```

<br />

<small>[voltar ao topo](#tabela-de-conteúdo)</small>

---

## updateMany()

### O que é?

É um método que permite a atualização de múltiplos Documentos de uma só vez e caso não utilizemos um filtro, todos os Documentos da Coleção serão atualizados.

### Sintaxe

A sintaxe do `updateMany()` segue exatamente o mesmo padrão do [`updateOne()`](#sintaxe), recebendo até três parâmetros _(filtro, update, opções)_ sendo os dois primeiros obrigatórios.

``` bash
db.<coleção>.updateMany(
  { <filtro> },
  { <update> },
  { <opções> }  # opcional
);
```

``` bash
db.my-collection.updateMany(
  { sale: true },
  { $mul: { price: Decimal128("0.8") } }  # o operador $mul será abordado mais a frente
)
```
<br />

<small>[voltar ao topo](#tabela-de-conteúdo)</small>

---

## Operador $set

### O que é?

É um operador que irá alterar o valor de um, ou mais campos especificados, podendo alterar tantos os campos de `1º nível` do Documento, assim como campos _embedados_.

### Sintaxe

Por se tratar de um operador, seu uso deve ser feito dentro de um método que o aceite, no caso métodos de _update_.

Para utilizá-lo é muito simples, basta o declararmos e logo após definimos os campos e os seus novos valores.

``` bash
{ $set: { <campo>: <valor>, <campo>: <valor> } }
```

``` bash
{ $set: { color: "blue" } }
```

<br />

<small>[voltar ao topo](#tabela-de-conteúdo)</small>

---

## Operador $mul

### O que é?

É um operador que irá **MUL**tiplicar o valor do campo selecionado por um multiplicador especificado e como já é de se esperar, esse operador somente irá funcionar em campos do tipo numérico

### Sintaxe

A sintaxe do `$mul` é tão simples quanto a do `$set`, com a única diferença de que algumas vezes iremos precisar realizar a conversão de tipos, como por exemplo de um inteiro para decimal.

Para realizar a multiplicação, tudo que precisamos fazer é declarar o campo a sofrer essa alteração e o multiplicador, se necessário, também precisamos fazer a conversão de tipos.

``` bash
{ $mul: { <campo>: <multiplicador>, <campo>: <conversor>(<multiplicador>) } }
```

``` bash
{ $mul: { price: 0.8, "sale.percentage": 0.2 } }
```

Obs: _"Caso o campo no qual estamos tentando aplicar a multiplicação não exista, o MongoDB automaticamente o criará e atribuirá valor `0` a ele"_.

<br />

<small>[voltar ao topo](#tabela-de-conteúdo)</small>

---

## Operador $inc

### O que é?

É um operador que incrementa ou decrementa, campos numéricos. O decremento é, de forma objetiva, um _"incremento negativo"_, ou seja, utilizamos o `$inc` com um número negativo.

### Sintaxe

Para realizarmos o incremento de um campo tudo que precisamos fazer é declarar o operador `$inc` e o campo a ser modificado, juntamente com o valor desejado.

``` bash
{ $inc: { <campo>: <valor> } }
```

``` bash
{ $inc: { qty: -5, order: 1 } }
```
Obs: _"Caso o campo no qual estamos tentando aplicar o incremento não exista, o MongoDB automaticamente o criará e o atribuirá valor que estamos tentando aplicar a ele, mesmo que esse valor seja negativo"_.

<br />

<small>[voltar ao topo](#tabela-de-conteúdo)</small>

---

## Operadores $min e $max

### O que são?

São operadores que realizam uma comparação para então aplicar a modificação desejada.

O `$min` irá aplicar a modificação apenas nos campos que possuírem um valor maior do que aquele especificado por nós após o operador, em palavras mais simples, o `$min` irá _"arrastar"_ o valor do campo para baixo.

O `$max` irá aplicar a modificação apenas nos campos que possuírem um valor menor do que aquele especificado por nós após o operador, em palavras mais simples, o `$max` iras _"arrastar"_ o valor do campo para cima.

### Sintaxe

Apesar dos operadores possuírem comportamentos opostos, a sintaxe segue a mesma para ambos.

Primeiro declaramos o operador `$min`/`$max`, em seguida o campo que queremos modificar e por fim o novo valor que desejarmos.

``` bash
{ $min: { <campo>: <valor> } }
{ $max: { <campo>: <valor> } }
```

``` bash
{ $min: { stamina: 0 } }
{ $max: { maxMana: 4000 } }
```

Obs: _"Caso o campo no qual estamos tentando aplicar a modificação não exista, o MongoDB automaticamente o criará e o atribuirá valor que estamos tentando aplicar a ele, mesmo que esse valor seja negativo"_.

<br />

<small>[voltar ao topo](#tabela-de-conteúdo)</small>

---

## Operador $currentDate

### O que é?

É um operador que irá atribuir a data corrente ao campo especificado, essa data pode ter dois tipos: o `Date`, que é o padrão; ou o `timestamps`.

### Sintaxe

Para utilizarmos o operador `$currentDate` tudo o que precisamos fazer é declará-lo, dizer qual campo irá recebe-lo e por fim passar `true` como valor do campo.

Porém se quisermos utilizar `timestamp` como formato precisamos utilizar o operador `$type`, especificando o formato `timestamp` através de uma string.

``` bash
{ $currentDate: { <campo>: <formato> } }
```

``` bash
{ $currentDate: { lastUpdate: true, canceled: { $type: "timestamp" } } }
```

Obs: _"Caso o campo no qual estamos tentando aplicar a modificação de data não exista, o MongoDB automaticamente o criará e o atribuirá a data atual a ele no formato especificado"_.

<br />

<small>[voltar ao topo](#tabela-de-conteúdo)</small>

---

## Operador $rename

### O que é?

É um operador que permite a troca da nomenclatura dos campos de um ou mais Documentos.

### Sintaxe

A sintaxe geral segue a mesma estrutura dos operadores vistos anteriormente, o invocamos, dizemos o campo a sofrer a modificação e por fim especificamos um novo valor. A única diferença é que o `$rename` não irá alterar o valor do campo, mas o campo em si.

### Sintaxe

Primeiro invocamos o operador `$rename`, em seguida declaramos o campo a ser renomeado e por fim dizemos qual deverá ser o novo nome.

``` bash
{ $rename: { <campo>: <novo nome> } }
```

``` bash
{ $rename: { promotion: "sales" } }
```

Obs: _"Caso o campo que estamos tentando renomear não exista, o MongoDB não irá gerar um erro, apenas não realizará nenhuma modificação"_.

<br />

<small>[voltar ao topo](#tabela-de-conteúdo)</small>

---

## Operador $unset

### O que é?

É um operador de deleção de campos, sempre que desejarmos excluir algum campo de um ou mais documentos, utilizamos o `$unset`.

### Sintaxe

Invocamos o operador `$unset`, seguido do campo a ser deletado e por fim passamos uma string vazia como valor.

Vale reforçar que o valor pode ser __literalmente qualquer coisa__, porém a documentação oficial exemplifica com uma string vazia.

``` bash
{ $unset: { <campo>: "" } }
```

``` bash
{ $unset: { uselessCamp: "" } }
{ $unset: { uselessCamp: "trem" } }  # irá deletar o campo uselessCamp igual
```

Obs: _"Caso o campo que estamos tentando deletar não exista, o MongoDB não irá gerar um erro, apenas não realizará nenhuma modificação"_.

<br />

<small>[voltar ao topo](#tabela-de-conteúdo)</small>

---

## Links Úteis

- [`updateOne` docs](https://www.mongodb.com/docs/manual/reference/method/db.collection.updateOne/)
- [`updateMany` docs](https://www.mongodb.com/docs/manual/reference/method/db.collection.updateMany/)
- [Operadores de Atualização](https://www.mongodb.com/docs/manual/reference/operator/update-field/)
- [Tipos de Dados do MongoDB](https://www.mongodb.com/docs/mongodb-shell/reference/data-types/) _Mongosh_
- [Ordem de Comparação para dados diferentes](https://www.mongodb.com/docs/manual/reference/bson-type-comparison-order/#faq-dev-compare-order-for-bson-types)
- [Filtros](../Day-29.2/Filter-Operators.md)
- [Operadores de Consulta](../Day-29.3/Operadores-Consulta.md)

<br />

<small>[voltar ao topo](#tabela-de-conteúdo)</small>