Tutorial de MongoDB para Iniciantes

Diversos sites grandes principalmente Web Commerces usam o MongoDB.


Tutorial de MongoDB para Iniciantes

MongoDB é um software de banco de dados orientado a documentos livre, de código aberto e multiplataforma, escrito na linguagem C++.

Classificado como um programa de banco de dados NoSQL(termo genérico que representa os bancos de dados não relacionais, ou seja, não se baseia no princípio de que todos os dados estão armazenados em tabelas).

O MongoDB usa documentos semelhantes a JSON com esquemas.

É desenvolvido pela MongoDB Inc. e publicado sob uma combinação da GNU Affero General Public License e Licença Apache.

Modelo de dados

Como os dados são guardados no MongoDB(estilo JSON), por isso é um banco de dados não relacional(diferentemente do MySQL, Oracle, PostgreSQL, SQLite,…).

Modelo Relacional: Modelo Relacional

Modelo MongoDB(NÃO Relacional): NÃO Relacional JSON

Terminologias no MongoDB

Base de dados

O banco de dados é um contêiner físico para coleções.

Coleção

Coleção é um grupo de documentos do MongoDB. É o equivalente a uma tabela RDBMS.

Documento

Um documento é um conjunto de pares de valores-chave. Os documentos têm esquema dinâmico.

Comparação com os nomes usados em SQL

RDBMS MongoDB
Banco de Dados Banco de Dados
Tabela Coleção
Linha Documento
Coluna Campo
Junção de tabela Documentos incorporados
Chave Primária Chave Primária (chave padrão _id fornecida pelo próprio mongodb)
mysqld/oracle mongod
mysql/sqlplus mongo

Documento de exemplo

O exemplo a seguir mostra a estrutura do documento de um blog, que é simplesmente um par de valores-chave separados por vírgula.

{
   _id: ObjectId(7df78ad8902c)
   title: 'Visão geral do MongoDB',
   description: 'MongoDB, um banco de dados NoSQL',
   by: 'Marcos Oliveira',
   url: 'https://www.terminalroot.com.br',
   tags: ['mongodb', 'database', 'nosql'],
   likes: 100,
   comments: [
      {
         user:'user1',
         message: 'meu primeiro comentário',
         datecreated: new date(2011,1,20,2,15),
         like: 0
      },
      {
         user:'user2',
         message: 'meu segundo comentário',
         datecreated: new date(2011,1,25,7,45),
         like: 5
      }
   ]
}

Vantagens do mongodb

diversos sites grandes, principalmente, webcommerces usam o mongodb, pois gera muito trabalho e processamento do servidor ao criar seleção de dados variados de um único produto.

por exemplo, um notebook existem diversos dados descritivos: marca, modelo, série, descrição, cor,… e isso pra quem programa banco de dados sabe a “dor de cabeça” que é criar essas relações em sql . mas com o mongodb isso é bem simples.

entre diversas áreas como:

  • big data
  • infraestrutura móvel e social
  • gerenciamento de dados do usuário
  • datahub utilizam o mongodb.

Instalação

antes de qualquer coisa, é necessário possuir o sistema de arquivos xfs habilitado no kernel, pois o mongodb o utiliza junto com a gnu c library, mais conhecida como glibc:

essa parte não é necessária para quem não usa gentoo

su
cd /usr/src/linux
make menuconfig

habilite de acordo com essas imagens:

essa parte não é necessária para quem não usa gentoo

file system kernel linux xfs kernel linux

depois reconstrua e reinicie o computador:

make && make modules_install && make install
grub-mkconfig -o /boot/grub/grub.cfg
reboot

no gentoo basta rodar o comando(ou sem sudo com o usuário root, su -c "emerge dev-db/mongodb"):

use --ask ou somente -a como parâmetro, e se quiser não adiconar ao world use --oneshot ou simplesmente -1, exemplo: sudo emerge -a1 dev-db/mongodb use o gereciador de pacotes da sua distro, ex.: sudo apt install mongodb para debian, ubuntu e outros.

sudo emerge dev-db/mongodb

após instalar, é necessário criar um diretório na raiz do seu sistema para que o mongodb crie o diretório para bancos de dados:

sudo mkdir -p /data/db/
sudo chown -R $USER:$USER /data
sudo chown -R $USER:$USER /data/db

agora confira se já há um grupo mongodb criado com o comando:

cat /etc/group | cut -d: -f1 | grep mongodb

se a saida for: mongodb , então tá tudo certo, se não for, você precisará criar esse grupo com o comando: sudo groupadd mongodb

agora adicione seu usuário à esse grupo:

após adicionar, será necessário deslogar e logar novamente no sistema para que as alterações tenham efeito.

sudo usermod -aG mongodb $USER

Configurações

o arquivo de configuração do mongodb pode ser localizado em: cat /etc/mongodb.conf e o mesmo contém as seguintes informações:

as linhas ‘comentadas’(iniciadas com # são ignoradas)

storage:
    dbpath: "/data/db"

systemlog:
    destination: file
    path: "/var/log/mongodb/mongodb.log"
    quiet: true
    logappend: true

net:
    port: 27017
    bindip: 127.0.0.1

sobre as configurações:

  • dbpath: "/data/db" - o caminho do mongodb, se o seu estiver com /var/lib/mongodb altere para esse;
  • path: "/var/log/mongodb/mongodb.log" - onde são guardados os logs;
  • port: 27017 - a porta padrão, ou seja, você não precisa iniciar o mongodb com o comando: mongo --port 27017 se essa linha estiver devidamente configurada e “descomentada”.
  • bindip: 127.0.0.1 - endereço de execução, ou seja, o loopback, se quiser alterar para um endereço específico, use essa linha.

para evitar problemas de permissão, recomendo você excluir tudo que possa existir dentro do diretório: /var/lib/mongodb

sudo rm /var/lib/mongodb/*

após isso, é necessário iniciar o daemon, nesse caso para o openrc:

se você usa systemd, veja o comando equivalente aqui: https://wiki.gentoo.org/wiki/openrc_to_systemd_cheatsheet

sudo rc-service mongodb start

se quiser que o mongodb seja iniciado automaticamente sempre que você iniciar seu sistema, rode:

sudo rc-update add mongodb default

se quiser conferir se o serviço já está rodando, use um desses comandos: rc-service mongodb status.

Observação , Se houver erro, recomendo você retirar o mongodb da inicialização, ex.: sudo rc-service del mongodb default . Reiniciar seu computador , ou tentar remove um arquivo temporário de bloqueio que fica em : sudo rm -rf /tmp/mongodb-27017.sock

E depois de removido ou reiniciado. Iniciar o MongoDB manualmente com o comando: mongod & , depois de listado todos os processos, basta pressionar ENTER e abrir o mongodb:

mongo

exemplo: openrc mongodb

após devidamente configurado, é só entrar no mongodb via shell:

mongo

para sair do mongodb, basta rodar o comando: exit.

Instalação no Ubuntu 20.04

  • Atualizações e dependências
sudo apt update
sudo apt install dirmngr gnupg apt-transport-https ca-certificates software-properties-common
  • Download
wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
  • Adicionar o repositório
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
  • Atualizar o repositório
sudo apt update
  • Instalar
sudo apt install mongodb-org
  • Verificando se já foi inicializado

    Adicionar na inicialização automática NÃO é recomendado

sudo systemctl status mongod
  • Inicializando
sudo systemctl start mongod
  • Rodando
mongo

Criando um usuário administrador

no shell mongo, adicione um usuário com a função useradminanydatabase no banco de dados admin. inclua funções adicionais conforme necessário para este usuário. por exemplo, o seguinte cria o usuário nomedousuario no banco de dados admin com a função useradminanydatabase e a função readwriteanydatabase.

a partir da versão 4.2 do mongo shell, é possível usar o método passwordprompt() em conjunto com vários métodos/comandos de autenticação/gerenciamento de usuários para solicitar a senha, em vez de especificar a senha diretamente na chamada de método/comando. no entanto, você ainda pode especificar a senha diretamente como faria com as versões anteriores do shell mongo.

LEMBRANDO que o MongoDB é case sensitive, ou seja, faz total distinção de MAIÚSCULAS e minúsculas.

use admin
db.createUser(
  {
    user: "marcos",
    pwd: "123456",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
  }
)

se quiser copie e cole o código(shift + control + v , para colar no terminal) com as devidas alterações realizadas, exemplo de saída:

successfully added user: {
	"user" : "marcos",
	"roles" : [
		{
			"role" : "useradminanydatabase",
			"db" : "admin"
		},
		"readwriteanydatabase"
	]
}

saia do shell mongo exit . agora para logar os parâmetros são similares ao do mysql:

mongo -u nomedousuario -p
# mongodb shell version v4.2.2
# enter password: [insira_sua_senha]

ou com mais detalhes: mongo --port 27017 --authenticationdatabase "admin" -u "nomedousuario" -p

[Opcional] - Crie usuários adicionais se necessário

perceba que ele só terá permissão específicas read e/ou readwrite em bancos específicos também: test e reporting

use test
db.createuser(
  {
    user: "usuarionormal",
    pwd:  passwordprompt(),   // or cleartext password
    roles: [ { role: "readwrite", db: "test" },
             { role: "read", db: "reporting" } ]
  }
)

depois é só logar com esse usuário: mongo --port 27017 -u "usuarionormal" --authenticationdatabase "test" -p.

na documentação tem detalhes para situações gerais, se quiser dê uma olhada na documentação.

Usando o MongoDB (comandos)

  • bancos de dados (databases)
    • show dbs - lista todos os bancos de dados, o alias desse comando é show databases;
    • use [nome-do-banco] - selecionar um banco de dados, ex.: use admin;
    • db - verifica qual o banco de dados em uso no momento;
    • use terminalroot - cria um banco de dados, mas só passa a existir efetivamente quando você cria uma collection e insere algum dado nela, se não o mesmo não estará disponível quando você listar os bancos, deixará de existir;
    • db.dropdatabase() - apaga um banco de dados, usar após selecionar use nome-do-banco que deseja;

  • collections (tabelas)
    • show collections - Mostra as collections;
    • createcollection() - Cria uma collection, protótipo dela é createcollection("nomedatabela", opções), exemplo: db.createcollection("minhacolecao").
    • db.nome_da_colecao.find().pretty() - Ler todos os dados de uma coleção, ex.: db.system.users.find().pretty() , ler todos os dados da coleção system.users, equivalente à select * from tabela. essa saída sairá formatada, se quiser os dados numa única linha, use sem o método .pretty(): db.system.users.find();
    • db.nome_da_colecao.insert() - Insere dados numa coleção, ex.: db.minhacolecao.insert( { "_id" : 0, "site" : "terminal root", "url" : "terminalroot.com.br", "content" : "sobre mongodb" } );
    • db.nome_da_colecao.update(consulta, o_que_atualizar, opções) - Atualiza(update) dados em um documento(campo), ex.: db.minhacolecao.update({'content':'sobre mongodb'},{$set:{'content':'mongodb definitivo tutorial'}}), altera o documento de nome content que tem o valor: sobre mongodb por mongodb definitivo tutorial;
    • db.nome_da_colecao.drop() - Deleta uma coleção, ex.: db.minhacolecao.drop(), deleta a coleção minhacolecao.
    • db.dados.remove({"mail": "james@brown.org"}) - Remove um documento( linha em SQL ) que possui uma coluna( campo em SQL ) mail igual à james@brown.org.

Se você inserir dados sem informar o _id ele será gerado automaticamente, tipo assim:

db.dados.insert({ "nome": "James Brown", "mail": "james@brown.org" })

WriteResult({ "nInserted" : 1 })

Criando uma collection(ela é criada automaticamente ao inserir os dados) e já inserindo dados:

> use terminalroot
> db.createCollection("dados")
{ "ok" : 1 }
> db.dados.insert({
... "_id" : 1,
... "nome" : "Marcos Oliveira",
... "mail" : "marcos@gentoo.org"
... })
WriteResult({ "nInserted" : 1 })
> 

Verificando os dados inseridos

db.dados.find().pretty()
{ "_id" : 1, "nome" : "Marcos Oliveira", "mail" : "marcos@gentoo.org" }
  • help saída conforme imagem abaixo: help mongodb

veja a imagem abaixo de alguns comandos que citamos: comando mongodb terminal root

para mais comandos consulte a referência das comparações e se já souber sql e deseja traduzir o comando para mongodb use o querymongo. =)

Mais Informações de Comandos

# shell
mongo --help
man mongo

# servidor
mongod --help
man mongod

# utilitário de despejo de dados
mongodump --help
man mongodump

# utilitário de exportação
mongoexport --help
man mongoexport

# utilitário gridfs
mongofiles --help
man mongofiles

# utilitário de importação
mongoimport --help
man mongoimport

# ferramenta de captura e repetição de tráfego
mongoreplay --help
man mongoreplay

# ferramenta de restauração de dados
mongorestore --help
man mongorestore

# roteador de consulta de cluster
mongos --help
man mongos

# utilitário de estatísticas
mongostat --help
man mongostat

# monitor de atividade
mongotop --help
man mongotop

LINKS ÚTEIS


mongodb nosql sql mysql


Compartilhe


Nosso canal no Youtube

Inscreva-se


Marcos Oliveira

Marcos Oliveira

Desenvolvedor de software
https://github.com/terroo


Crie Aplicativos Gráficos para Linux e Windows com C++

Aprenda C++ Moderno e crie Games, Programas CLI, GUI e TUI de forma fácil.

Saiba Mais

Receba as novidades no seu e-mail!

Após cadastro e confirmação do e-mail, enviaremos semanalmente resumos e também sempre que houver novidades por aqui para que você mantenha-se atualizado!