Guia Prático: Aprenda a Manipular Dados no MongoDB

Guia Prático: Aprenda a Manipular Dados no MongoDB

Aprenda as operações básicas para manipular dados dentro do Banco de Dados noSQL mais usado no mundo: o MongoDB

Dando continuidade na série de MongoDB, após construir um Cluster de MongoDB usando o passo a passo do desse artigo, vamos agora manipular os dados dentro desse banco, ou como costumamos dizer, vamos aprender os nossos primeiros CRUDs¹.

¹Um acrônimo para as operações fundamentais de um banco de dados: Criar, Ler, Atualizar e Deletar.

A primeira coisa que precisamos entender no MongoDB é a nomenclatura que esse banco trás. Então vamos para um pequeno glossário:

Glossário MongoDBNo MongoDB, todos os dados são armazenados num formato muito conhecido chamado JSON.

Para manipular os dados seguindo os passos desse artigo faça download desse arquivo que contém uma lista de filmes já no formato JSON para adicionarmos no banco.

Os registros que iremos armazenar no MongoDB seguem essa estrutura:

JSON FilmeApós fazer o download do arquivo “carga.js” basta fazer uma inserção em massa que a collection de filmes estará populada:

# mongo localhost:27017/filmes carga.js

Agora entre no MongoDB e repare que foi criada uma base de dados chamada “catalogo” onde contém uma collection chamada filmes:

# mongo
> show dbs
> use catalogo
> db
> show collections
> db.filmes.find()

Iniciando nosso primeiro CRUD fizemos uma espécie de “select * from filmes” usando o “db.filmes.find()”, mas antes de falarmos sobre as querys, vamos inserir nosso primeiro dado fazendo o “insert” de mais um filme para essa base.

db.filmes.insert({"titulo":"O Círculo","ano":"2016","diretor":"James Ponsoldt","avaliacao":{"bom":0,"medio":0,"ruim":0}})

Veja que a sintaxe do comando é simples, basicamente precisamos informar qual a “tabela”, que chamados de collection, e qual a operação que queremos fazer, no caso o insert.  O comando acima pode parecer confuso, mas repare que tudo que está em azul na verdade é o documento JSON que foi inserido que segue a mesma estrutura do Interestelar só que em uma única linha.

Caso você tenha preenchido os dados do filme errado e queira apagar o registro que acabou de inserir basta mudar a operação de insert para remove:

db.filmes.remove({"titulo":"O Círculo","ano":"2016","diretor":"James Ponsoldt","avaliacao":{"bom":0,"medio":0,"ruim":0}})

Obviamente é possível deixar o comando menor pois não é preciso passar o documento JSON todo dentro da operação de remove. Nesse caso bastaria ter escolhido qualquer informação do documento, de preferência que seja única para evitar apagar outros registros:

¹> db.filmes.remove({"titulo":"O Círculo"})

¹ Não esqueça de inserir o dado novamente caso queira usar o remove acima. 😉

Mas você deve estar se perguntando, porque apagar o registro inteiro se eu apenas errei o ano de lançamento do filme? Não seria mais coerente apenas realizar um update? Com certeza seria, mas vamos deixar o update mais para o final do artigo pois updates sempre são assuntos delicados rs.

Seguindo nossos CRUDs vamos agora fazer algumas querys para conhecer melhor nosso catálogo de filmes.

Vimos anteriormente que se executarmos o db.filmes.find() ele irá retornar todos os registros (documentos) que estão nessa collection filmes.

Caso você prefira que a saída do find esteja formata para facilitar a visualização, pode complementar o comando usando o pretty:

> db.filmes.find().pretty()

Agora vamos buscar todos os filmes que foram lançados em 2016. Repare que para isso iremos complementar o find com o critério da busca que precisará estar dentro de um documento:

> db.filmes.find({"ano":"2016"}).pretty()

Quando adicionamos critérios para fazer buscas em uma collection podemos usar alguns operadores e também expressões regulares. Vamos a alguns exemplos interessantes:

Usando um critério duplo com o OR, vamos buscar todos os filmes de 2000 ou 2005. Nesse caso teremos que usar um array de subdocumentos:

> db.filmes.find({"$or":[{"ano":"2000"},{"ano":"2005"}]}).pretty()

Pensando em expressão regular, poderíamos buscar todos os filmes que começam com a letra O. Repare que o mongoDB, igualmente o Linux é case sensitive por padrão, ou seja, ele faz diferenciação de letras minúsculas e maiúsculas então precisamos sempre informar caso a busca precisar ser insensitive com a opção i:

> db.filmes.find({"titulo":{"$regex":"^o","$options":"i"}})

Agora imagine que eu queira buscar todos os filmes de 3 diretores (Coppola, Nolan, Spiel) que eu não sei o nome exato de como está armazenado na collection, eu poderia usar uma expressão regular para isso:

> db.filmes.find({"diretor":{"$regex":"coppola|nolan|spiel","$options":"i"}})

As opções de querys são quase que infinitas, principalmente quando falamos de coisas mais complexas como Aggregation e projeção, que são assuntos para um outro post.

Seguindo nosso CRUD, faltou falarmos sobre o Update, ou seja, a atualização de um documento. Esse assunto também é bastante extenso que vale um post só para fazer sobre isso, nesse artigo faremos atualizações mais simples.

Vamos adicionar um filme ao catálogo e depois corrigir as informações dele:

>db.filmes.insert({"titulo":"A Múmia","ano":"2016","diretor":"James Ponsoldt","avaliacao":{"bom":0,"medio":0,"ruim":0}})

No registro acima tanto o ano de lançamento quanto o diretor  estão errado: Ano: 2017   Diretor: Alex Kurtzman

> db.filmes.insert({"titulo":"A Múmia","ano":"2016","diretor":"James Ponsoldt","avaliacao":{"bom":0,"medio":0,"ruim":0}})

Vamos corrigir usando o update. Esse operador sempre irá esperar o critério da busca do registro que se quer alterar e depois a operação de alteração:

> db.filmes.update({"titulo":"A Múmia"},{"ano":"2017","diretor":"Alex Kurtzman"}

Veja que ele busca pelo filme com o nome “A Múmia” e na sequência define os novos valores para ano e diretor. Se você realizar uma busca por esse registro você verá que ele não só alterou o que foi solicitado mas também apagou todos os demais atributos do registro como o Título e as avaliações.

Antes do Update:

{ "_id" : ObjectId("59697df46cb8ef084d8ae562"), "titulo" : "A Múmia", "ano" : "2016", "diretor" : "James Ponsoldt", "avaliacao" : { "bom" : 0, "medio" : 0, "ruim" : 0 } }

Depois do Update:

{ "_id" : ObjectId("59697df46cb8ef084d8ae562"), "ano" : "2017", "diretor" : "Alex Kurtzman" }

Isso aconteceu pois o update da forma mais simples, sempre irá entender que você não quer apenas alterar um atributo do documento e sim o documento inteiro para ficar do jeito que você definiu no comando.

Para alterar o dado sem alterar a estrutura original do documento, precisamos acrescentar um operador no update que é set.

Antes de executarmos irei deletar o registro passando como condição do remove o ID do documento acima e criá-lo novamente para repetir o mesmo exemplo:

> db.filmes.remove({"_id": ObjectId("59697df46cb8ef084d8ae562")})

> db.filmes.insert({"titulo":"A Múmia","ano":"2016","diretor":"James Ponsoldt","avaliacao":{"bom":0,"medio":0,"ruim":0}})

Agora irei fazer o update usando o set para não alterar o documento e apenas atualizar o ano e o diretor:

> db.filmes.update({"titulo":"A Múmia"},{"$set":{"ano":"2017","diretor":"Alex Kurtzman"}})

> db.filmes.find({"titulo":"A Múmia"})

Muito bom, agora você já conhece o básico de como manipular dados no MongoDB. Nos próximos artigos da série a gente vai se aprofundando em cada uma das operações do CRUD.

Se você já conhece MongoDB não sei de acesso o artigo sobre Aggregation aqui!

Referências: https://docs.mongodb.com/manual/

Anterior Descubra as novidades e recursos da nova versão do Angular
Próxima Descubra como o Zabbix automatiza o monitoramento de recursos

About author

Gaby Dias
Gaby Dias 1 posts

Com mais de 15 anos de experiência em projetos FOSS (Free and Open Source Software) atualmente é Diretora de Operações na empresa 4Linux, sendo responsável pelas áreas de Cloud, DevOps, Infraestrutura, Treinamento, como também atuando em projetos de missão crítica. Atuou como Engenheira de Projetos na HP-Brasil desenhando soluções na plataforma Linux/Unix. Possui as certificações RHCE, RHCSA, LPI1, LPI2, LPI303, LPI304, Zabbix Certified, LFCS, LFCE.

View all posts by this author →

Você pode gostar também

Monitoramento TI

Automatização de ambientes com Rundeck

Por que automatizar seu ambiente? Nos últimos anos, a automação tem crescido como um elemento imperativo em todos os negócios. Independente da área, temos observado um notável aumento no uso

Infraestrutura TI

Automatizando Tarefas com Shell Script

Já se aventurou pela linha de comando de sistemas Unix ou Linux? Se sua resposta for sim, então provavelmente já ouviu falar de Shell Script. Mas o que seria exatamente

Infraestrutura TI

Guia prático: Configurando a fila Dead Letter Queue no Logstash

O Logstash é um pipeline de processamento de dados do lado do servidor de código aberto que ingere dados de várias fontes, transforma-os simultaneamente e os envia para seu “stash”