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.
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 MongoDB(NÃO Relacional):
O banco de dados é um contêiner físico para coleções.
Coleção é um grupo de documentos do MongoDB. É o equivalente a uma tabela RDBMS.
Um documento é um conjunto de pares de valores-chave. Os documentos têm esquema dinâmico.
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 |
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
}
]
}
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:
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
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
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:
após devidamente configurado, é só entrar no mongodb via shell:
mongo
para sair do mongodb, basta rodar o comando: exit
.
sudo apt update
sudo apt install dirmngr gnupg apt-transport-https ca-certificates software-properties-common
wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
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
sudo apt update
sudo apt install mongodb-org
Adicionar na inicialização automática NÃO é recomendado
sudo systemctl status mongod
sudo systemctl start mongod
mongo
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
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.
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;
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:
veja a imagem abaixo de alguns comandos que citamos:
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. =)
# 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