Mongo Shell

Daniel Dias
Daniel Dias
Published in
16 min readDec 7, 2016

A Quarta postagem do blog será sobre a parte prática da minha monografia de especialização em Desenvolvimento Java. Neste capitulo irá aprender o básico de MongoDB utilizando o Mongo Shell.

Boa Leitura.

Segundo Marchioni (2015), o shell Javascript do Mongodb lhe permite uma interação com a instância do banco de dados Mongo a partir da linha de comando. O shell é uma ferramenta trivial para desempenhar funções de administração, monitoramento de uma instancia em execução ou inserindo documentos.

Conforme citado na sessão anterior, para iniciar o MongoDB devemos executar o mongod, através do prompt, navegue para o diretório de instalação do MongoDB e execute o comando mongod.exe conforme mostrado na figura 11.

1

Figura 11 — Inciando o servidor MongoDB Fonte: Aplicação do Windows 8.

Após executar o comando o servidor MongoDB será iniciando conforme mostrado na figura 12:

2

Figura 12 — Servidor MongoDB iniciado Fonte: Aplicação do Windows 8

Conforme a figura 12, o servidor mongo foi iniciado na sua porta padrão 27017, é conforme citado o mesmo detectou a pasta data\db para armazenar os dados.

Para utilizarmos o Shell do Mongodb, devemos executar no mesmo diretório da figura 11 o comando mongo, para podermos está interagindo com o servidor mongo como é demostrado na figura 13 o shell executando após o comando inserido:

3

Figura 13 — Shell do MongoDB Iniciado Fonte: Aplicação do Windows 8.

Conforme a figura 13, foi iniciado o shell do Mongodb e automaticamente ele se conectou a um banco de dados existente por padrão da sua instalação. É a partir desse shell que poderemos está criando e excluindo banco de dados, coleções e também utilizando as operações de CRUD (Create, Read, Update e Delete) em nosso banco.

CRIANDO DATABASE, COLLECTION E DOCUMENTOS

Conforme citado nas sessões anteriores, o MongoDB cria data bases a partir de uma coleção de documentos (Collections), e essas collections são formadas por um agrupamento de documentos no formato JSON.

Banker, Kyle. et al (2016), explicam que o MongoDB divide as coleções em bancos de dados separados. E que ao contrário a sobrecarga habitual que os bancos de dados produzem no mundo sql, os bancos de dados no MongoDB são somente espaços de nome para distinguir entre as coleções. Para consultar no MongoDB, precisaremos saber o banco de dados (ou namespace) e a collection para qual documento se deseja consultar.

Conforme a figura 13, o mongo se conectou ao banco de dados chamado test, para trocar de banco devemos usar o seguinte comando:

use nomedoBanco

Esse comando também é utilizado para a criação do banco de dados, caso ele não exista, após a execução do comando a seguinte mensagem é informada no shell, conforme a figura 14:

4

Figura 4 — Criando e Trocando de DataBase Fonte: Aplicação do Windows 8

Conforme a figura 14, foi o banco de dados que era test foi trocado pelo o nosso banco de dados que se chama OmegaWare, que no caso o mesmo foi criado, já que não existia.

Segundo Marchioni (2015), explica que para quem veio dos bancos de dados RDBMS, foi surpreendido que foi possível mudar para um novo banco de dados sem tê-lo criado anteriormente. O ponto é que a criação da base de dados no MongoDB não é necessária. Os bancos de dados e as coleções são criados primeiramente quando os documentos são realmente inseridos. Sendo assim, coleções se bancos de dados individuais podem ser criado em tempo de execução da mesma maneira que a estrutura de um documento é conhecido.

No MongoDB existe um comando que podemos usar para lista todas as bases de dados disponíveis que é:

show dbs

Ao executarmos esse comando será mostrado uma lista de banco de dados disponíveis, conforme ilustrada na figura 15:

5

Figura 15 — Listando as DataBase Fonte: Aplicação do Windows 8.

Na figura 15 podemos ver no momento só estamos com uma base de dados disponível, a nossa base só estará disponível quando um documento já estiver inserido.

INSERINDO UM DOCUMENTO

Para inserirmos um documento, precisamos informar em qual collection esse documento será salvo.

Conforme ilustrado na figura 2, um documento é inserido no formato Json, como exemplo iremos inserir um documento em nossa base de dado recém-criada utilizando os métodos fornecido pelo MongoDB:

InsertOne(): Este método insere no mongo um único documento na sua base de dados como é demonstrada abaixo ao inserirmos um documento no nosso banco conforme a Figura 16:

db.usuarios.insertOne(
{
Nome:"Daniel Dias dos Santos",
Idade:25,
Mensagem:"Inserindo um único documento no Mongo!"
}
)

Figura 16 — Inserindo com InsertOne Fonte: Autoria Pŕopria

Como visto na figura 16, foi criado um novo documento com 3 campos que são: Nome, Idade e Mensagem com os seus respectivos valores, onde o mesmo foram inseridos na sua collection (coleção) chamada usuários, que no caso essa collection não existia e foi criada após a inserção do documento. Em SQL essa mesma inclusão seria da seguinte forma:

INSERT INTO usuarios
(Nome,Idade,Mensagem)
VALUES
(“Daniel Dias dos Santos”,25,”Exemplo de Inserção SQL”)

Figura 17 — Inserção única em SQL Fonte: Autoria Pŕopria

  • InsertMany(): Este método insere no mongo múltiplos documentos em sua base de dados como é demonstrado na figura 18 ao inserirmos mais documentos na collection usuários:
db.usuarios.insertMany (
[
{
Nome:”Daniel Dias dos Santos”,
Idade:25,
Mensagem:”Documento 1"
},
{
Nome:”MongoDB”,
Idade:7,
Mensagem:”Documento 2"
},
{
Nome:”Java”,
Idade:20,
Mensagem:”Documento 3"
}
]
)

Figura 18 — Exemplo de Inserção Múltiplos Documentos Fonte: Autoria Pŕopria

Conforme visto na figura 18, ao utilizarmos o método insertMany(), foi inserido na mesma collection três documentos com os mesmos campos ,porem com valores diferentes. No caso essa mesma operação em SQL seria da seguinte forma:

INSERT INTO usuarios
(Nome,Idade,Mensagem)
VALUES
(“Daniel Dias dos Santos”,25,”Exemplo de Inserção SQL”)
(“MongoDB”,7,”Exemplo de Inserção SQL”)
(“Java”,20,”Exemplo de Inserção SQL”)

Figura 19 — Inserção Múltipla em SQL Fonte: Autoria Pŕopria

  • Insert(): Este método também adiciona novos documentos a uma collection. Assim como o método insertOne() e insertMay() , ele pode tanto inserir um único documento quanto uma série de documentos, como exemplificado na figura 20 :
db.usuarios.insert(
{
Nome:"Daniel Dias dos Santos",
Idade:25,
Mensagem:"Utilizando o Médoto insert()"
}
)

Figura 20 — Inserindo com Insert Fonte: Autoria Pŕopria

CONSULTANDO DOCUMENTOS E CONHECENDO OUTRAS FUNÇÕES

Segundo a documentação do MongoDB, uma consulta tem como um alvo um conjunto especifico de documentos, onde as consultas seguem um critério ou condições, que identificam os documentos que o MongoDB tem que retorna aos clientes. Uma consulta pode ainda incluir uma projeção que especifica os campos dos documentos correspondentes para retornar. Possivelmente as consultas podem ser modificadas para impor limite, pular e ordenar.

Para podemos retornar nossos dados armazenados no banco, utilizamos o método find () para consultar, ela é semelhante ao comando select do SQL.

Chodorow (2013), explica que o método find retorna um subconjunto de documentos em uma coleção, de nenhum documento para toda a coleção. Os documentos retornados são determinados pelo primeiro argumento que encontrar que é um documento que especifica os critérios para a consulta.

Como exemplo iremos recuperar todos os valores do banco de dados utilizado a seguinte sintaxe db.nomeDaCollection.find() ,conforme é demonstrada na figura 21 :

7

Figura 21 — Exemplo de Consulta Utilizando find() Fonte: Autoria Pŕopria[/caption]

Conforme a execução do comando, o resultado foi a exibição de todos os dados contido na collection usuários. Em SQL esse comando seria da seguinte forma select * from usuários, assim obtendo todos os registros da tabela no modelo relacional.

Um ponto a observar é que no resultado da consulta foi retornado um campo a mais chamado _id e que em nenhum momento quando inserimos os dados informamos o campo e o seu valor.

Conforme explica Banker, Kyle. Et al (2016), o campo _id pode ser visto como uma chave primaria do documento. Em que todos os documentos no MongoDB requerem um _id e se caso esse campo não estiver presente será criado automaticamente pelo MongoDB com o tipo ObejctID e adicionado ao documento ao mesmo tempo. Assim como nas chaves primarias de bancos relacionais, ObjectId também é única, porém pode definir o seu próprio _id em um documento, sendo que ObjectID é apenas um padrão do MongoDB.

Com o método find () podemos fazer busca mais específica como buscar por um determinado valor em nossa collection como apresentada na figura 22:

8

Figura 22 — Exemplo de Consulta Específica Fonte: Autoria Própria[/caption]

Conforme o exemplo da figura 22, a consulta deve retornar todos os documentos de uma collection, onde campo Nome contém o valor Daniel Dias dos Santos, em SQL o seu comando seria:

SELECT * FROM usuarios WHERE Nome=’Daniel Dias dos Santos’

“A exibição padrão do resultado de busca do MongoDB nem sempre é legível. Para resolver esse problema, basta adicionar no comando o sufixo..pretty()”.Boaglio (2015, p. 27).

Como exemplo a figura 23 demonstra como é o resultado da consulta sem o pretty() :

9

Figura 23 — Exemplo de Consulta sem pretty Fonte Autoria Própria[/caption]

Como podemos observar, a consulta devolveu resultado de difícil compreensão. Para o resultado sair da mesma forma que a figura 22 usamos o pretty() da seguinte forma :

db.usuarios.find(
{
"Nome":"Daniel Dias dos Santos"
}
).pretty()

Além dessa função, o método find apresenta outras funções como aponta Hows, David et al. (2015), onde explicam que o MongoDB incluir diversas funções de uso para um controle mais preciso de consultas, como o uso de funções sort, limit e skip como é demonstrada abaixo:

  • Sort(): A função sort() tem como objetivo classificar os resultados obtidos após as consultas. Podemos classificar em ordem crescente ou decrescente usando 1 ou -1, respectivamente. Essa função é equivalente a Order By no SQL e ele usa o nome da chave e o método de classificação como critérios como o exemplo a seguir:
db.usuarios.find().sort( 
{
"Nome":1
}
)

Conforme o exemplo, resultado da classificação é baseada no valor chave que no caso Nome vai ter seu valor na ordem crescente. Este é a ordem padrão do método quando não passamos parâmetros, caso queremos resultado na ordem decrescente trocamos o valor 1 por -1, da mesma forma podemos trocar o valor chave por uma outra.

Limit(): Podemos está utilizando esta função para especificar o número máximo de resultados que queremos retornar. Ela requer apenas um parâmetro, ou seja, devemos passar um número dos resultados que desejamos obter, como por exemplo:

db.usuarios.find().limit(2)

Ao executarmos o comando, o resultado da consulta vai nos trazer dois documentos, pois especificamos um limite de retorno. Quando passamos o valor 0, o resultado é que todos os documentos serão retornados.

  • Skip(): Esta função nos permite salta o primeiros n documentos em uma coleção, como exemplo o comando a seguir ira saltar 2 documentos e nossa base : db.usuarios.find().skip(2)

Como resultado, irá retornar somente um documento, visto que pulamos dois, caso existisse mais documentos ele irá trazer todos os documentos da coleção usuários e irá ignorar os 2 primeiros.

Ainda de acordo com os autores citado, o Mongodb não seria poderoso, se não fosse a sua capacidade de esta combinando estes comandos. Podemos combinar praticamente qualquer função e usando em conjunto com outras funções, conforme o exemplo:

db.usuarios.find()
.sort(
{
Idade:-1
}
).limit(10).skip(20)

Esse exemplo limitou o resultado até 10, saltando os 20 primeiros documentos e classificando a Idade em ordem decrescente.

Até o momento, nossa consulta tem retornado todos os documentos da nossa collection, e que nem sempre iremos querer retornar todos, por este motivo, o MongoDB fornece um método findOne() para retornarmos um único documento que queremos e ainda podemos fazer buscas especificas para obtermos resultados mais precisos. A sintaxe do do findOne é idêntica a função find (): db.nomeDaCollection.findOne(query,projeção)

Ao executarmos esse comando, será retornado o primeiro documento dentro da coleção de acordo com sua ordem natural que reflete na ordem do documento no disco. Caso nenhum documento satisfaça a consulta, o método retorna null.

Como exemplo deste método, iremos fazer uma consulta especificando os campos que queremos retornar conforme a figura 24, onde localiza na coleção usuários e retorna somente o nome, idade e o _id:

10
Figura 24 - Exemplo do findOne() Fonte : Autoria Própria[/caption]Uma outra função importante é o count(),que tem a finalidade de contar quantos documentos têm em uma coleção específica, no exemplo, será retornado da base de dados 3 documentos armazenados na collection:db.usuarios.count()Boaglio (2015), listas algumas operações de busca, que são:[caption id="attachment_792" align="aligncenter" width="722"]
11
Tabela 2 - Operações de Busca Fonte: Boaglio (2015,p.46)[/caption]ATUALIZANDO DOCUMENTOSAssim como o insert, o MongoDB oferece 4 métodos de atualização dos dados que serão demonstrados a sua utilização:
  • updateOne(): Este método nos permite atualizar somente um único documento.
[caption id="attachment_800" align="aligncenter" width="609"]
12
Figura 25 - Exemplo de UpdateOne() Fonte: Autoria Própria[/caption]Conforme a figura 25, esta operação de atualização sobre a collection usuários, definiu uma nova mensagem para o campo Mensagem para o primeiro documento que corresponda o filtro de idade maior que 7. Esse comando em SQL seria desta forma:[code language="sql"]UPDATE usuarios
SET Mensagem = 'Exemplo de SQL'
WHERE Idade > 7
LIMIT 1
[/code]
Figura 26 - Exemplo de Update SQL - Fonte: Autoria Própria
  • updateMany(): Este método nos permite atualizar múltiplos documentos em nossa collection.
[caption id="attachment_826" align="aligncenter" width="614"]
13
Figura 27 - Exemplo do updateMany() Fonte: Autoria Própria[/caption]Na figura 27, foi feita a mesma operação da figura 25, sendo que trocamos o método updateOne para updateMany, que ao executar o comando, será atualizada o campo Mensagem de todos os documentos onde o filtro corresponda a idade maior que 7.Este comando em SQL seria da mesma forma da figura 26, só retirando o Limit 1 do comando.
  • replaceOne(): Este método substitui um único documento na collection sobre o filtro.
[caption id="attachment_837" align="aligncenter" width="615"]
14
Figura 28 - Exemplo de replaceOne() Fonte: Autoria Próṕria[/caption]Esta operação de substituição na collection usuários, substitui o primeiro documento que corresponde ao filtro de Nome que é Daniel Dias dos Santos com um novo documento, como podemos observar na figura 28. Que no caso tanto o Nome quanto a Mensagem foram modificadas, menos a Idade, já que a deixamos com o mesmo valor. Em SQl este comando seria da seguinte forma:[code language="sql"]UPDATE usuarios
SET Nome = 'Daniel' Idade = '25' Mensagem = 'Exemplo SQL'
WHERE Nome = 'Daniel Dias dos Santos'
LIMIT 1
[/code]
Figura 28 - Exemplo de Update SQL - Fonte: Autoria Própria
  • Update(): Segundo Hows, David et al. (2015), O Mongo fornece a função update() para esta realizando as alterações dos dados. Esta função recebe três argumentos principais que são critérios, objNew e as opções.
Onde os critérios permitem especificar a consulta que seleciona o registro na qual desejamos atualizar. Utilizamos o objNew para especificar a informação atualizada ou podemos fazer uso de um operador para fazer isso.Já o argumento de opções, permite que especificamos as suas opções ao atualizar o documento, e que possui dois valores possíveis que são: upsert e multi.A opção upsert permite especificar se a atualização dever ser um upsert, ou seja, ele diz ao MongoDB para atualizar o registro se ele existir e cria-lo se isso não acontecer.A opção multi, permite especificar se todos os documentos correspondentes devem ser atualizados ou se apenas o primeiro (ação padrão).[caption id="attachment_855" align="aligncenter" width="651"]
15
Figura 30 - Exemplo update() Fonte: Autoria Própria[/caption]O exemplo da figura 30, irá atualizar o campo Mensagem de todos os documentos em que a idade for maior que 7.DELETANDO DADOSAssim como o insert e o update o MongoDB oferece 3 métodos de deletar os dados, que serão demonstrados a sua utilização:
  • deleteOne(): De acordo com Hows, David et al. (2015), se desejarmos apagar um único documento, precisaremos especificar os critérios que irá usar para encontrar o documento. Segundo eles, uma boa abordagem é a realização de um find () primeiro, pois dessa maneira garante que os critérios utilizados são específicos ao seu documento.
Neste exemplo utilizaremos as duas formas. A primeira é utilizando a abordagem proposta pelos autores e a segunda passando os critérios:[caption id="attachment_864" align="aligncenter" width="551"]
16
Figura 31 - Exemplo 1 de deleteOne() Fonte: Autoria Própria[/caption]Conforme a figura 31, utilizamos o método findOne() para buscar um único documento com critério passado e armazenamos o seu valor em uma variável de nome deletarPorBusca. Logo em seguinte utilizamos o método deleteOne() passando como parâmetro a variável deletarPorBusca. Ao executar o comando o documento será deletado da nossa collection usuários. O segundo exemplo é passando critérios:[caption id="attachment_872" align="aligncenter" width="592"]
17
Figura 32 - Exemplo 2 de deleteOne() Fonte: Autoria Própria[/caption]A figura 32, utilizamos o método deleteOne() passando parâmetro. Esta operação ira excluir o primeiro documento em que a Idade é 20.  Em SQL este comando seria da seguinte forma:[code language="sql"]
DELETE FROM usuarios WHERE Idade = '20' LIMIT 1
[/code]
Figura 33 - Exemplo de delete SQL - Fonte: Autoria Própria
  • deleteMany(): Assim como as outras, esta função deleta múltiplos documentos em uma collection, conforme a figura 34 e a sua forma em SQL é semelhante ao da figura 33:
[caption id="attachment_885" align="aligncenter" width="553"]
18
Figura 34 - Exemplo de deletaMany() Fonte : Autoria Própria[/caption]
  • Remove(): Este função aceita critério de consulta para determinar quais os documentos para remover, bem como um documento de opções que afeta ao seu comportamento, tais como a opção justone para remover apenas um único documento:
[caption id="attachment_893" align="aligncenter" width="434"]
19
Figura 35 - Exemplo de remove() Fonte: Autoria Própria[/caption]O comando executando na figura 35, irá deletar todos os documentos que seguir o critério passado, onde a idade é igual a 25.Hows, David et al. (2015), explicam que pode haver necessidade de está apagando uma coleção inteira, para isso temos duas funções, que são drop() e a própria remove(). Segundo eles, a utilização do remove () é mais lenta do que a drop(), pois todos os índices serão mantidos dessa forma. Com o drop(), será mais rápido se necessitamos remover todos os dados ,bem como todos os índices de uma coleção. O exemplo da figura 36 remove toda coleção usuários, incluindo os documentos:[caption id="attachment_901" align="aligncenter" width="456"]
20
Figura 36 - Exemplo de drop() Fonte: Autoria Própria[/caption]A função drop() retorna true ou false , dependendo se a operação foi concluída com êxito. Da mesma forma que podemos está apagando uma collection, podemos também está deletando um banco de dados do MongoDB com a função dropDatabase() ,como na figura 37 :[caption id="attachment_908" align="aligncenter" width="613"]
21
Figura 37 - Exemplo de dropDatabase() Fonte : Autoria Próṕria[/caption]No exemplo, foi removido o banco de dados em estávamos trabalhando atualmente.ARRAYSMarchioni (2015), explica que o MongoDB possui uma linguagem de consulta rica que suporte armazenamento e acesso a documento como array. A grande coisa sobre matrizes em documentos é que MongoDB entende sua estrutura e sabe como chegar dentro das matrizes para executar as operações em seu conteúdo. Isso nos permite consultar em matrizes e construir índices utilizando seu conteúdo.Como exemplo, será criado um par de documentos que contém um array de itens conforme a figura 38:
db.usuarios.insert(
[
{
Desenvolvedores:["Daniel","James","Bill"]
},
{
Desenvolvedores:["Daniel","Lisa","Paul"]
}
]
)
Figura 38 - Exemplo de Arrays - Fonte: Autoria PrópriaFaremos uma consulta sobre a matriz para encontrar em Desenvolvedores o que contem Bill armazenado:
22
Figura 39 - Exemplo de Consulta por Arrays Fonte: Autoria Própria[/caption]Podemos também combinar arrays usando mais de um elemento, utilizando $all. Ela permite que combinarmos com uma lista de elementos como exemplificado na figura 40:
23
Figura 40 - Exemplo de Consulta por Combinação de elementos. Fonte: Autoria PrópriaDOCUMENTOS INCORPORADOSSegundo Marchioni (2015), podemos utilizar um documento como um valor para uma chave. Isso que chamamos de um documento incorporado.Documentos incorporados podem ser usados para esta organizando os dados de uma forma mais natural do que apenas uma estrutura plana de pares chave/valor. Desta forma combina bem com a maioria das linguagens orientada a objeto, que contém uma referência para outra estrutura na sua classe.Na figura 41 criaremos uma estrutura, que é atribuído a uma variável no mongo shell:[code language="javascript"]
usuario = {
"_id":1234,
Nome:"Daniel",
Cursos: [
{
Titulo:"Java Básico",
Ano:2011,
Instituição:"Prime Cursos"
},
{
Titulo:"SQL Básico",
Ano:2012,
Instituição:"Soft Blue"
}
]
}
[/code]
Figura 41 - Exemplo de Documento incorporado - Fonte: Autoria PrópriaTendo definido a nossa variável, iremos inseri-la em nossa collection usuários utilizando o insert() com o nome da variável como parâmetro.Conforme a figura 41, criamos um único documento contendo três campos, e um desses campo contém um array contendo dois documentos incorporado em seu conteúdo.Para podemos consultar o subdocumento, usamos a notação de ponto, conforme o exemplo da figura 42, podemos escolher a lista de cursos cujo o ano é 2011 utilizando o critério Cursos.Ano:
24
Figura 42 - Exemplo de Consulta de SubDocumento Fonte: Autoria Própria[/caption]Neste capítulo foram apresentados exemplos práticos de uso do mongoDB pelo shell com as suas operações básico para se está trabalhando com esse banco NoSQL.No próximo capítulo será apresentado o uso prático do MongoDB em conjunto com a tecnologia Java através do MongoDB Java Drive.REFERÊNCIASBanker, Kyle; et al. MongoDB in Action, Second Edition. Shelter Island: Manning, 2016.Boaglio, Fernando. MongoDB construa nova aplicações com nova tecnologias. São Paulo: Casa do Código, 2015.Chodorow, Kristina. MongoDB The Definitive Guide, 2nd Edition. Gravenstein Highway North: O’Reilly, 2013.Hows, David; et el. The Definitive Guide to MongoDB A complete guide to dealing with Big Data using MongoDB, Third Edition . New York, NY: Apress, 2015.Marchioni, Francesco. MongoDB for Java Developers. Birmingham: Packt Publishing Ltd,2015.MongoDB. Introduction to MongoDB. 2016. Disponível em: < https://docs.mongodb.com/manual/introduction />. Acesso em: 11 de maio 2016.

--

--

Daniel Dias
Daniel Dias

SouJava Board Member, JCP Member, JSR-371 (MVC 1.0), JSR-382 (Config) specifications contributor, EG JSR-385 (UoM) and Eclipse Committer .