Fazer um update no MongoDB é uma ação que precisa ser pensada! No seu contexto de negócio talvez seja necessário efetuar atualizações em documentos salvos no MongoDB. Já vou iniciar nossa conversa dizendo que atualizações são sempre operações “caras” para o banco de dados , seja ele relacional ou NoSQL, sendo assim, avalie se esta operação realmente é necessária!
O processo de atualizaçao no MongoDB é muito abrangente, porque pode envolver a atualização da estrutura do documento JSON e também alterações dos valores. O objetivo deste post é conhecermos algumas ou quase todas as possibilidades de alterações em um documento.
Este é o quinto post da série sobre MongoDB. Se achar necessário veja os seguintes posts:
1- 3 coisas que você deve saber sobre a instalação do MongoDB.
2- 9 itens extremamente importantes que você precisa saber sobre o MongoDB
3- O que você precisa saber antes de acessar o MongoDB
4- O que você precisa saber para incluir e excluir dados do MongoDB?
Os cuidados com o comando Update
Excluir um documento é perigoso! Mas atualizar incorretamente um conjunto de documentos é muito pior!!! Imagine se a sua empresa anunciar o produto mais caro pelo valor de 2,00 e mais de 200 pessoas compram o produto com o valor errado?
Antes de executar seus Updates em produção faça o teste em ambientes não-produção! Parece exagero? Confiem em mim, todo cuidado na atualização é necessário e muito importante, para te poupar de dores de cabeça futuras.
O comando UPDATE no MongoDB
Esta função atualiza os documentos de uma coleção. Tem 3 parâmetros:
-
- Condição;
- Valores;
- Opções
UPSERT
É uma das opções do comando update e significa que se não existir um documento que obedeça ao critério especificado ele deve ser criado.
Reconstruindo um documento
Ao usar o comando update conforme o exemplo abaixo, o documento será recriado, ou seja, sua estrutura ficará igual a que está sendo definida. Ressaltando que qualquer atributo que não for especificado será excluído. Tenha cuidado!!!
db.NomeColeção.update({atributo da condição : valor da condição}, {atributo 1 : valor, atributo 2: valor}, {upsert : true})
Atualizar os valores de um atributo
Ao usar o operador $set os valores dos atributos indicados no comando abaixo serão atualizados.
db.NomeColeção.update({atributo da condição : valor da condição}, {$set :{atributo 1 : valor, atributo 2: valor}}, {upsert : true})
Outra maneira de atualizar um documento (equivalente ao upsert) é a função save:
db.NomeColeção.save({atributo da condição : valor da condição}, {atributo 1 : valor, atributo 2: valor})
Incrementando valores
Imagina que você possua um atributo que precisa ser incrementado… Para isso pode fazer uma consulta, obter o valor do atributo, incrementar o valor e atualizar o documento! Ou pode usar o operador $inc, que recebe como parâmetros o atributo que sera incrementado e o valor do incremento.
db.NomeColeção.update({atributo da condição : valor da condição}, {$inc :{atributo 1 : valor incremento}})
Apagando atributos específicos
O operador $unset permite que você remova dos documentos da sua coleção um determinado atributo.
Cuidado porque sua aplicação pode estar esperando este atributo…
db.NomeColeção.update({atributo da condição : valor da condição}, {$unset :{atributo que será excluído : 1}})
Arrays
Um atributo de um documento no MongoDB pode receber um conjunto de valores, ou seja um array, que é representado no JSON com [ ].
Nos itens seguintes veremos como atualizar os valores existentes em arrays.
Adicionar um valor em um array
O operador $push permite que um item seja incluído em um array. Atenção ao fato de que se o atributo não existe ele será criado, se existe e não é um array o comando dará erro.
db.NomeColeção.update({atributo da condição : valor da condição}, {$push:{atributo : valor que será incluído no array }})
Adicionar vários valores em um array
Se utilizarmos o modificador $each (ele é opcional) junto com o operador $push podemos incluir vários itens em um array,
db.NomeColeção.update({atributo da condição : valor da condição}, {$push:{atributo : { $each : [valor que será incluído , valor que será incluído 2, valor que será incluído 3] } } } )
Uma outra maneira de adicionar itens a um array é usar o operador $addToSet. O diferencial deste operador é que ele só adiciona um item a um array se ele ainda não existir.
db.NomeColeção.update({atributo da condição : valor da condição}, {$addToSet : {atributo : { $each : [valor que será incluído , valor que será incluído 2, valor que será incluído 3] } } } )
Remover valores de um array
Temos alguns operadores que permitem remover os dados de um array. São eles:
- $pop = remove um único elemento de um array. O exemplo abaixo remove o último item do array
db.NomeColeção.update({atributo da condição : valor da condição}, {$pop:{atributo : 1 }})
O exemplo abaixo remove o primeiro atributo
db.NomeColeção.update({atributo da condição : valor da condição}, {$pop:{atributo : -1 }})
E se vc acha que mudar os números altera o elemento do array que será removido… Vc errou! Qualquer numero negativo indica que o primeiro item será removido, qualquer número positivo remove o último item.
- $pull = remove todas as ocorrências de um valor especificado do array
db.NomeColeção.update({atributo da condição : valor da condição}, {$pull:{atributo : valor que será removido }})
- $pullAll = permite remover vários valores de um array
db.NomeColeção.update({atributo da condição : valor da condição}, {$pullAll : {atributo : [valor que será excluído , valor que será excluído 2, valor que será excluído 3] } } )
Vamos testar?
Na minha opinião uma das etapas mais ricas no aprendizado (principalmente de tecnologia) é a experimentação! Escrevi até agora sobre uma série de comandos… Talvez somente ler não te ajude a aprender, mas tenho certeza que você alcançará este objetivo com mais facilidade se executar os comandos, manipular os dados, alterar os comandos…
Abaixo tenho algumas sugestões de comandos para te ajudar nos testes:
Criar variável com um novo documento
Variável chamada documentoX
documentoX= ({
“NomeSite”: “SQL4.me“,
“titulo”: “Certificação SQL Server”,
“categoria”: “Gravar Vídeo”,
“Canal Youtube”: “DB4Beginners”,
“keyWords”: [
“SQL Server 2016”,
“70-761”,
“Banco de Dados”,
“Relacional”
],
“Finalizado”:false
})
Inserir documento na coleção
db.Atividades.insert (documentoX)
Atualizar sem o operador $set (reconstrói o documento)
db.Atividades.update({Finalizado : false} , {Titulo : “teste”, categoria : “update”}, {upsert : true})
Executar novamente
db.Atividades.update({Finalizado : false} , {Titulo : “teste”, categoria : “update”}, {upsert : true})
Contar a quantidade de documentos na coleção
db.Atividades.count()
Validar como ficaram os documentos da coleção
db.Atividades.find().pretty()
Inserir na coleção o documento
db.Atividades.insert (documentoX)
Atualizar o atributo Finalizado para true com o operador $set
db.Atividades.update({Finalizado : false} , {$set : {Finalizado : “true”}}, {upsert : false})
Apagar o atributo Finalizado para true com o operador $set
db.Atividades.update({Finalizado : false} , {$unset : {Finalizado : “true”}}, {upsert : false})
Conclusão
Embora o MongoDB não utilize a linguagem SQL, é muito flexível para a atualização da estrutura e dos valores dos documentos. Use esta flexibilidade com cuidado! Sempre avalie os comandos e tenha em mente que Updates são comandos que tendem a ter um desempenho menor.
Se você é um desenvolvedor iniciante lembre-se que conhecer o MongoDB é um diferencial na sua carreira e pode te ajudar a cria aplicativos cada vez melhores! Lembre-se conhecimento é aquilo que nada e nem ninguém pode tirar de vc!
Referências
Se você tem alguma dúvida, é só me procurar no Twitter, ou no facebook, ou comentando este post, ou no formulário de contato. Não se preocupe… Eu sempre respondo (mesmo que seja para avisar que estou pesquisando).
Livro: Introdução ao MongoDB
Imagens: http://www.tech-coffee.net/software-update-sccm-part-3-automatic-deployment-rules/