Introdução ao MongoDB

MongoDB é um banco de dados orientado a documentos que faz parte da família dos bancos de dados NoSQL1. Banco de dados orientados a documentos são ideais para o armazenamento e gestão de Big Data (Megadados) – um grande conjunto de dados estruturados e não estruturados. Documentos são representações agregadas de uma entidade de banco de dados, e são apropriados para o armazenamento de dados semi-estruturados que requerem o uso extensivo de ‘nulls‘ em SGBDRs (Sistemas gestor de banco de dados relacionais).

logo-mongodb-tagline

Um documento agregado pode ser acessado com uma chamada única ao banco de dados, em vez de se ter o join de múltiplas tabelas para responder à uma consulta. O schema2 nestes tipos de banco de dados são dinámicos, ao contrário dos bancos de dados relacionais, que requerem que o schema seja definido antes. Logo, para metodologias de desenvolvimento ágeis, tradicionais modelos relacionais são muitas vezes inapropriados, porque cada vez que se adiciona uma nova funcionalidade, o schema completo deve ser modificado.

Em MongoDB, um registo é um documento armazenado num formato binário (JSON3) e documentos são agrupados em colecções (collections). Colecções  são análogos à tabelas de banco de dados relacionais. A tabela abaixo mostra uma comparação entre conceitos e/ou termos em SQL e MongoDB.

Termos/conceitos SQLTermos conceitos MongoDB
Banco de dados (database)Banco de dados (database)
Tabela (table)Colecção (colection)
Linha (row)documento ou documento BSON
Coluna (column)Campo (field)
índice (index)índice (index)
Table joinsdocumentos embutidos e linkados
Chave Primária (primary key)Chave Primária (primary key)
Qualquer coluna pode ser definida como campo único ou uma combinação de de colunas como chave primáriaEm MongoDB a chave primária é automaticamente definida como _id

As principais características do MongoDB são: alta performance por suportar modelos de dados embutidos e índices; alta disponibilidade através de um conjunto de réplicas (grupo de servidores MongoDB que mantém o mesmo conjunto de dados)  para providenciar o failover4 automático e redundância dos dados, escalação automática através de fragmentação automática (para distribuir os dados através de um cluster de máquinas) e schema flexível (uma vez que o schema de um documento pode ser diferente do schema de um outro com a mesma collection).

Collections são agrupadas no banco de dados. Existem alguns bancos de dados reservados, tais como:

admin: Este é o banco de dados raiz. Existe certos comandos como readAnyDatabase, readWriteAnyDatabase. dbAdminAnyDatabase, userAdminAnyDatabase, clusterAdmin, etc, que podem ser executados apenas a partir do banco de dados admin.

local: Na replicação, o banco de dados local armazena dados internos de réplicas para cada membro do conjunto de réplicas. Collections deste banco de dados não são replicadas.

config: Este banco de dados armazena informações sobre shards (fragmentos).

 

Componentes principais do pacote MongoDB

Mongod: Este é o processo principal do banco de dados que manipula as requisições dos dados, gere formatos dos dados e executa operações de gestão em background.

Mongos: Este é o controller e roteador de consulta (query router) para clusters fragmentados, e faz o serviço de roteamento para configurações do MongoDB shard, processa e consulta na camada da aplicação para determinar a localização dos dados no cluster fragmentado.

Mongo: Este shell interactivo do MongoDB provê uma interface poderosa para administradores de sistemas, assim como uma forma para os desenvolvedores testarem suas consultas e outras operações directamente no banco de dados.

 

Instalação do MongoDB

MongoDB pode ser instalado na maior parte das plataformas existentes (Linux, OS X, Windows, etc.), e suporta tanto arquitecturas de 32 bit como de 64 bit.

Neste artigo focarei apenas na instalação do MongoDB no Mac OS X e no Linux, uma vez que no windows o processo é bastante simples, ou seja, o famoso seguinte-seguinte.

A forma mais simples de se instalar o MongoDB no OS X é através do gestor de pacotes Homebrew. Para tal, basta rodar os seguintes comandos:

$ brew update
$ brew install mongodb

No Linux (Ubuntu no nosso caso), o processo é relativamente fácil também:
Comece por criar o arquivo /etc/apt/sources.list.d/mongodb-org-3.2.list com o seguinte conteúdo:

deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.2 multiverse

Agora importe a chave pública:

$ sudo apt-key adv –keyserver hkp://keyserver.ubuntu.com:80 –recv EA312927

Actualize a base de dados local de pacotes:

$ sudo apt-get update

Agora sim, podes instalar a última versão disponível do MongoDB:

$ sudo apt-get install mongodb-org

E por último, inicie o serviço:

$ sudo service mongod start

Feito isso, estamos prontos para começar a usar o MongoDB. Para isso basta executarmos o seguinte comando:

$ mongo

E o resultado será como mostra a imagem abaixo:

MongoDB Interactive Shell

Mais informações sobre a instalação em outras plataformas, visite: https://docs.mongodb.org/master/installation/

Por padrão, o shell do MongoDB irá conectar-se ao banco de dados “test”.

> db
test

Captura de ecrã 2016-03-23, às 16.41.05

Na imagem acima, podemos ver alguns comandos que podem usados nas operações CRUD (create, read, update, delete).

post‘ é um documento armazenado na collection ‘article’ no banco de dados. O comando find pode ser usado para fazer consultas numa collection. MongoDB não irá criar permanentemente um banco de dados até inserir dados a ele, e irá criar uma collection no seu primeiro uso. Logo, não é necessário criar uma collection antes de inserirmos dados (é o conceito de schema flexível que vimos anteriormente). Todo documento armazenado no MongoDB terá uma chave _id (o tipo padrão é ObjectID), que automaticamente será inserido no documento, e o seu valor será único para cada collection em particular.

Para actualizações, estão disponíveis os métodos db.collection.update() e o db.collection.save(). Estes métodos actualizam um único documento por padrão. Com a opção multi, update() pode actualizar todos os documentos numa collection que corresponde a uma determinada consulta:

db.article.update({title:”Introducão ao MongoDB”},{$set:{date:”23 March 2016″} })

Para remover documentos da collection, usamos o método db.collection.remove(), e podemos passar um critério de consulta para determinar quais documentos serão removidos.

MongoDB suporta escalabilidade horizontal e alta taxa de transferência através da fragmentação (sharding) – um método que permite armazenar dados através de múltiplas máquinas. Fragmentação é feita para aumentar a memória RAM disponível e o espaço em disco, reduz a carga do servidor, leitura e escrita de dados com uma taxa de transferência melhor, etc. Na fragmentação, dados são distribuídos entre múltiplos servidores. Cada shard executa menos operações e armazena menos dados na medida que o servidor for crescendo.

Fonte: https://docs.mongodb.org/manual/core/sharding-introduction/
Fonte: https://docs.mongodb.org/manual/core/sharding-introduction/

Na imagem acima, caso o banco de dados tenha 1 terabyte de dados, e com 4 shards, então cada shard deve armazenar apenas 256GB de dados. Se existir 40 shards, então cada shard deve armazenar 25GB de dados. Shards armazenam dados e provêm alta disponibilidade e consistência de dados.

MongoDB é um banco de dados que suporta escalabilidade horizontal ao adicionarmos mais e mais nós no cluster; As opções de segurança são limitadas ao nível do banco de dados. A opção de conceder permissões à nível das collections não está disponível.

 

Referências

1 – https://pt.wikipedia.org/wiki/NoSQL
2 – https://pt.wikipedia.org/wiki/Esquema_de_banco_de_dados
3 – https://pt.wikipedia.org/wiki/JSON
4 – https://en.wikipedia.org/wiki/Failover

https://docs.mongodb.org/manual/mongo/

,,,,