DEV Community

Gabriel_Silvestre
Gabriel_Silvestre

Posted on

MongoDB - Updates Complexos

Tabela de Conteúdos


Modificadores de Atualizações em Arrays

O que são?

Modificadores de Atualizações em Arrays é uma tradução livre de Update Operator Modifiers, que nada mais são do que operadores que permitem a modificação do comportamento das atualizações em arrays internos de Documentos, possibilitando a ordenação, por exemplo.

Onde/Quando utilizar?

Como visto em sua definição logo acima, esses operadores interagem diretamente com arrays, logo devemos utilizá-los somente em interações onde os campos sejam desse tipo.

Lembrando que esses operadores, além de estarem restritos aos campos do tipo array, também só poderão ser utilizados em operações de atualização.

Quais são?

De acordo com a documentação oficial, existem quatro modificadores, esses que serão abordados logo abaixo.

São eles: $each; $position; $slice e $sort.

Sintaxe

Apesar de similares, cada Update Operator Modifiers possui uma peculiaridade em sua sintaxe, então iremos explicá-los individualmente.

$each

  • Função: permite a inserção de múltiplos valores em um campo do tipo array. (funciona somente com os operadores $push e $addToSet)

  • Sintaxe: deve ser declarado após o campo a sofrer modificação e recebe um array com os valores a serem inseridos.

{ <operador de atualização>: <campo>: { $each: [<valor 1>, <valor 2>, <valor 3>] } }
Enter fullscreen mode Exit fullscreen mode
{ $push: tasks: { $each: ["study", "go to the gym", "read"] } }
Enter fullscreen mode Exit fullscreen mode

voltar ao topo

$position

  • Função: permite a inserção de um, ou mais valores em uma posição específica do array. (funciona somente com o operador $push)

  • Sintaxe: é necessário o uso do $each previamente, após isso declaramos o $position e dizemos a partir de qual posição os novos valores serão inseridos.

{ $push: <campo>: { $each: [<valor 1>, <valor 2>, <valor 3>], $position: <index> } }
Enter fullscreen mode Exit fullscreen mode
{ $push: tasks: { $each: ["study", "go to the gym", "read"], $position: 2 } }
Enter fullscreen mode Exit fullscreen mode

voltar ao topo

$slice

  • Função: limita a inserção de novos valores. (funciona somente com o operador $push)

  • Sintaxe: é necessário o uso do $each previamente, após isso declaramos o $slice e definimos qual o número máximo de valores a serem adicionados.

{ $push: <campo>: { $each: [<valor 1>, <valor 2>, <valor 3>], $slice: <index> } }
Enter fullscreen mode Exit fullscreen mode
{ $push: tasks: { $each: ["study", "go to the gym", "read"], $slice: 2 } }
# irá inserir somente o "study" e o "go to the gym"
Enter fullscreen mode Exit fullscreen mode

voltar ao topo

$sort

  • Função: ordena todos os valores contidos no array, bem como os que serão adicionados. (funciona somente com o operador $push)

  • Sintaxe: é necessário o uso do $each previamente, após isso declaramos o $sort e definimos por qual campo será feita a ordenação, bem como o tipo de ordenação (crescente ou decrescente).

{ $push: <campo>: { $each: [<valor 1>, <valor 2>], $sort: { <campo>: <tipo de ordenação> } } }
Enter fullscreen mode Exit fullscreen mode
{ $push: products: { $each: [{ name: "doll", qty: 5 }, { name:  "lego", qty: 2 }], $sort: { qty: 1 } } }
# no caso de não ser um objeto basta definir o tipo de ordenação diretamente => $sort: 1
Enter fullscreen mode Exit fullscreen mode

voltar ao topo


Operador $push

O que é?

É um operador que lida diretamente com campos do tipo array, permitindo a adição de novos valores sem a necessidade de recriar o campo do zero.

Sintaxe

Há duas formas de se utilizar o operador $push, podemos adicionar apenas um item ao final do array, ou adicionar vários itens de uma única vez, além de conseguirmos alterar outros comportamentos, como ordenação automática.

Para o primeiros caso, basta invocarmos o $push, declararmos o campo a sofrer a adição e por fim definir o item a ser adicionado.

Já nos outros casos é obrigatório o uso do operador $each, que além de permitir a inserção de múltiplos valores, também abre a possibilidade de alterarmos mais comportamentos.

{ $push: { <campo>: <novo item> } }
{ $push: { <campo>: { $each: [<novos itens>], <outras configurações> } } }
Enter fullscreen mode Exit fullscreen mode
{ $push: { products: { name: "computer", price: 2499.99 } } }
{ $push: { products: $each: [{ name: "computer", price: 2499.99 }, { name: "mouse", price: 499.99 }] } }
Enter fullscreen mode Exit fullscreen mode

voltar ao topo


Operador $pop

O que é?

É um operador de deleção, ele poderá excluir o primeiro ou o último elemento de um array.

Sintaxe

Para deletarmos o primeiro ou o último item de um array basta invocarmos o método $pop, em seguida definimos o campo que contém o array a sofrer a deleção e por fim dizemos qual elemento a ser excluído (primeiro ou último).

{ $pop: { <campo>: <item a ser excluído> } }
Enter fullscreen mode Exit fullscreen mode
{ $pop: { products: 1 } }
# 1 => exclui o último
# -1 => exclui o primeiro
Enter fullscreen mode Exit fullscreen mode

voltar ao topo


Operador $pull

O que é?

É um operador que permite a deleção de itens em um campo do tipo array através de condições, dessa forma todos os itens que se encaixam nas condições definidas são excluídos.

Sintaxe

O primeiro passo é invocarmos o $pull, após isso definimos o campo a sofrer as deleções e por fim dizemos as condições a serem cumpridas para que um elemento seja deletado.

{ $pull: { <campo>: <query de deleção> } }  # query é equivalente a "conjunto de condições"
Enter fullscreen mode Exit fullscreen mode
{ $pull: { products: { price: { $gt: 400.00 } } } }
Enter fullscreen mode Exit fullscreen mode

voltar ao topo


Operador $addToSet

O que é?

Esse operador funciona de forma similar ao $push, porém além de adicionar novos valores a um campo do tipo array, o $addToSet também realiza uma verificação para evitar valores duplicados, ou seja, o novo valor somente será inserido se ele for único.

Vale ressaltar que esse o processo de validar Documentos duplicados é mais "sensível" ao erro, isso porque o operador irá considerar como duplicata apenas os Documentos que forem EXATAMENTE IGUAIS.

Sintaxe

Assim como seu funcionamento, sua sintaxe também é extremamente similar a do operador $push, o que significa que podemos adicionar um item, ou mais itens de uma única vez utilizando o $each, porém o $addToSet não aceita outras opções como o $sort.

Para adicionarmos um item basta invocarmos o operador $addToSet, seguido do campo a sofrer a adição e então definimos o novo valor a ser adicionado.

Já para adicionarmos múltiplos itens, invocamos o operador $addToSet, seguido do campo a sofrer a adição, depois declaramos o operador $each e por fim, dentro de um array, definimos os valores a serem adicionados.

{ $addToSet: { <campo>: <valor> } }
{ $addToSet: { <campo>: { $each: [<valor1>, <valor2>, <valor3>] } }
Enter fullscreen mode Exit fullscreen mode
{ $addToSet: { email: gabriel@gabriel.com } }
{ $addToSet: { email: { $each: [gabriel@gabriel.com, daniela@daniela.com, fran@fran.com] } }
Enter fullscreen mode Exit fullscreen mode

Obs: "Caso exista um valor duplicado dentro do array que estamos realizando a adição, o MongoDB executará a ação sem levantar nenhum erro, porém o valor duplicado não é adicionado, apenas mantêm-se o valor pré-existente".

voltar ao topo


Filtros em Arrays

O que são?

São formas pelas quais podemos selecionar um único valor dentro de um array de forma dinâmica, fazendo um paralelo com o JS, seria equivalente a HOF .find().

Sintaxe

A sintaxe desses filtros, apesar de simples, tem sua peculiaridade, isso porque ela funciona de forma similar a interpolação do mysql2 com node.

Utilizamos os filtros de array dentro operações de atualização, através do operador $[<identifier>] definimos um nome genérico que será usado como referência na interpolação. Agora para realmente definirmos o valor a ser buscado, utilizamos a opção arrayFilters, passando todas as referências que criamos anteriormente e atribuindo um valor a elas.

{ <operação de att>: { <campo>.$[<referência>]: <novo valor> } },
{ arrayFilters: [{ <referência>: <valor a ser buscado> }] }
Enter fullscreen mode Exit fullscreen mode
{ $set: { tasks.$[t].title: "study Node" } },
{ arrayFilters: [{ t.title: "study React" }] }

# o item com o "title" study React vai ter seu valor trocado para study Node
Enter fullscreen mode Exit fullscreen mode
# Por se tratar de um recurso mais complexo, irei exemplificar com o método de atualização completo
# A função continua sendo a mesma, trocar "study React" por "study Node"

db.user_tasks.updateOne(
  { _id: 1 },
  {
    $set: { tasks.$[T].title: "study Node" }
  },
  { arrayFilters: [{ T.title: "study React" }] }
)
Enter fullscreen mode Exit fullscreen mode

voltar ao topo


Links Úteis

voltar ao topo

Top comments (0)