Banco de Dados MongoDB

Daniel Dias
Daniel Dias
Published in
11 min readDec 5, 2016

A segunda postagem do blog será sobre a minha monografia de especialização em Desenvolvimento Java. Neste capitulo descrevo o assunto MongoDB.

Boa Leitura.

MongoDB é um banco de dados open source orientado a documentos escrito em C++ que prover alta performance, alta disponibilidade e escalonamento automático.

Seus dados são armazenados dentro de documentos semelhantes a JSON, porém utilizando uma versão binário do JSON chamada BSON, que retém os dados usando pares de chave/valor, conforme apresentada na figura 2 :

dco

Figura 2 — Um Documento MongoDB Fonte : Documentação do MongoDB

Segundo Lennon (2011), os bancos de dados orientado a documentos são bastantes diferentes dos tradicionais relacionais. Em vez de armazenar dados em estruturas rígidas, como tabelas, eles os armazenam em documentos vagamente definidos. No caso dos bancos relacionais, será preciso acrescentar uma nova coluna e também mudar a definição da própria tabela, que acrescentara aquela coluna a os registros existentes, embora ficariam com valores nulos. Isso se deve pelo fato dos bancos relacionais serem baseados em esquemas, sendo que em documentos, é possível acrescentar novos atributos aos documentos individuais sem que outros sejam alterados. Isso porque os bancos de dados orientados a documentos costumam a ser sem esquemas.

Vantagens e Características do MongoDB

As vantagens de se está utilizando um banco de dados orientado a documentos segundo a documentação do MongoDB são:

  • Documentos (ou seja, Objetos), correspondentes aos tipos de dados nativos em muitas linguagens de programação.
  • Documentos e matrizes incorporadas reduzem a necessidade de joins.
  • Esquemas dinâmicos que suportam polimorfismo.

Além dessas vantagens, a documentação apresenta algumas das suas principais características do uso do MongoDB que são:

  • Alta Performance: Onde prover de uma alta performance de persistência de dados em particular oferece um suporte para modelos de dados incorporadas, onde o mesmo reduz as atividades de I/O no sistema de banco de dados e suporte para índices de consultas mais rápida que incluem chaves incorporadas em documentos e matrizes.
  • Linguagem de Consulta Rica: MongoDB suporta uma rica linguagem de consultas que dão suporte as operações de leitura e escritas bem como para agregação de dados, pesquisa de texto e consultas Geoespacial.
  • Alta Disponibilidade: O MongoDB oferece também uma instalação de replicação chamada Replica Set que dispõe de um failover automática e redundância de dados. Replica Set é um grupo de servidores MongoDB que mantêm os mesmos conjuntos de dados, proporcionando redundância e aumento da disponibilidade dos dados.
  • Escalabilidade Horizontal: Como parte do seu núcleo de funcionalidade o MongoDB prove uma escalabilidade horizontal onde o Sharding distribui os dados em um cluster de maquinas e a Tag sharding que permite dirigir os dados para fragmentos específicos, tais como a ter em consideração a distribuição geográfica dos fragmentos.
  • Suporte para múltiplos engines de armazenamento: O MongoDB suporte multiplos mecanismo de armazenamento que sao WiredTiger Storage Engine e MMAPv1 Storage Engine. Alem disso o MongoDB fornece pluggable storage engine API que permite que terceiros desenvolvam engine de armazenamento para o MongoDB.

DataBase, Collections e Documentos

No MongoDB uma data base (banco de dados) é composta por uma coleção de documentos (Collections), onde essas collections são formadas por um agrupamento de documentos no formato JSON.

A figura 3 demonstra de maneira resumida os tres elementos abordados:

diagram

Figura 3 — Diagrama dos elementos núcleos do MongoDB. Fonte: MARCHIONI, 2015, p.8

Marchioni (2015, p.8), descreve de maneira resumida os conceitos da figura 3, onde:

  • Database: Este é o elemento de nível superior, contudo em um banco de dos relacional contem principalmente tabelas e visões, diferentes de um banco do Mongo, que por lado é um recipiente físico de uma estrutura chamado de coleção (collections). Cada banco de dados tem o seu próprio conjunto de arquivos no seus sistemas de arquivos, porem o MongoDB tem um único servidor normalmente tem vários banco de dados.
  • Collection: Este é um conjunto formado por documentos do MongoDB. Uma coleção é equivalente a uma tabela em bancos relacionais. Somente pode haver uma coleção com esse nome no banco de dados, mas várias coleções podem coexistir em um mesmo banco de dados. Normalmente essas coleções contidas em um banco de dados estão relacionadas, apesar de não impor um esquema como tabelas como os bancos relacionais fazem.
  • Documents: Esta é a unidade básica de dado no MongoDB. Basicamente, ela é composta por uns conjuntos pares de chave/valor. Ao contrário dos registros de banco de dados, o documento tem um esquema dinâmico, o que significa que os documentos fazem parte de uma mesma coleção e sem precisar ter o mesmo conjunto de campos. Da mesma forma que os campos contidos em um documento pode conter diferentes tipos de dados.

AD HOC QUERIES

Banker, Kyle. et al (2016) explica que um sistema que suporta consultas ad hoc, é dizer que não é necessário definir que tipo de consultas o sistema aceita. Em bancos relacionais se tem essa propriedade, porém eles vão executar qualquer consulta SQL formado com qualquer número de condições. A consulta ad hoc é fácil de adotar quando os únicos bancos de dados que usamos tenham sido relacionais.

Porem nem todos suportam as consultas dinâmicas. Por exemplo, o armazenamento de chave/valor são consultas abertas em apenas um eixo: o valor da chave. Assim como muitos outros sistemas, sacrificam o poder de consultas ricas em troca de um simples escalabilidade. O objetivo do MongoDB é preservar todo o poder da consulta que é fundamental para os bancos de dados relacionais.

ÍNDICES

Segundo o site do MongoDB (2015) índices são mecanismo crucial para otimização, desempenho e escalabilidade para um sistema, proporcionando acesso flexível aos dados. Assim como a maioria dos SGBDs, os índices melhorarão o desempenho de algumas operações por ordem de magnitude, que ocorrem associado a sobrecarga em operações de escrita, de uso de disco e consumo de memória.

Banker, Kyle. et al (2016) explica que os índices em MongoDB, são implementados com uma estrutura de dados em árvores-B, que também são utilizadas em vários bancos relacionais para otimizar uma variedade de consultas. O MongoDB ainda permite criar até 64 índices por coleção.

De acordo com o site do MongoDB (2015) explica que o MongoDB suportar muitos tipos de índices secundário que podem ser declaradas em qualquer campo do documento incluindo campos dentro de matrizes, que são:

  • Índices Únicos: Quando especificamos um índice como único, o Mongodb irá rejeitar as inserções de novos documentos ou atualizações de um documento com um valor existente para o campo para qual o índice original foi criado. Por padrão os índices não são definidos como único.
  • Índices Compostos: Índices compostos podem ser útil quando queremos especificar vários predicados para consultas. Por exemplo, em uma aplicação pode precisar busca clientes com base no último nome, primeiro nome e cidade, com um índice composto nesses critérios, a consulta podia ser eficientemente localizar os clientes com esses três valores especificados. Um benefício de índices compostos é que qualquer campo de liderança pode ser usado e este índice composto também otimiza as consultas a procura de clientes pelo primeiro nome.
  • Índices de matrizes: Os campos que contém uma matriz, os valores de cada uma são armazenada como uma entrada de índices separada. Por exemplo, documentos que descreve produtos pode incluir um campo para os componentes. Se houver um índice em um campo de componentes, cada componente é indexado e as consultas sobre o campo componente pode ser otimizada por este índice.
  • Índices TTL: Os índices Time to Live (TTL), permitem ao utilizador especificar um período de tempo, logo após os dados serão automaticamente excluídos do banco de dados. Um uso comum dos índices TLL é em aplicações que mantêm uma janela de históricos, como por exemplo, mas recente 100 dias para as ações dos usuários.
  • Índices Geoespaciais: Os índices geoespaciais, são utilizados para aperfeiçoar pesquisas relacionadas com localização dentro de um espaço bidimensional, tais como sistemas de projeções para a terra. Estes índices permitem que o MongoDB otimize consultas para os documentos que contem ponto ou um polígono que estão mais próximos de um determinado ponto ou linha, que está dentro de um círculo, retângulo ou polígono ou que se cruzam os mesmos.
  • Índices Parciais: Passando uma expressão de filtragem durante a criação do índice, um usuário pode instruir o MongoDB para incluir apenas os documentos que atendam as condições desejadas, como por exemplo, indexas apenas clientes ativos. Os índices parciais equilibram a entrega do desempenho da consulta de baixa latência e reduzindo a sobrecarga do sistema.
  • Índices esparsos: Contém somente entrada para os documentos que contém o campo especificado. Isso porque o modelo de dados do MongoDB para documentos, permite a flexibilidade no modelo de dados do documento para documento, é comum que alguns campos estão presente apenas em um subconjunto de todos os documentos. Índices esparsos permitem índices menores e mais eficientes quando os campos não estão presentes em todos os documentos.
  • Índices por busca de textos: O MongoDB fornece um índice especificado para pesquisas de texto que utiliza, regras linguísticas específicas de idiomas avançada para decorrentes, tokenização, palavras maiúsculas, minúsculas e parada. As consultas que utilizam este índice retornam documentos de ordem de relevância e um ou mais campos podem ser incluídas no índice de texto.

REPLICAÇÃO

Segundo Chodorow (2013) replicação é uma forma de manter cópias idênticas de seus dados em diversos servidores é recomenda para todas as implantações de produção. A replicação mantém a aplicação em execução e seus dados seguros, mesmo se algo acontecer com um ou mais servidores. Com o MongoDB, configuramos esta replicação através da criação de uma réplica set.

Banker, Kyle. et al (2016) explica que a réplica set, consiste em muitos servidores MongoDB, que normalmente cada servidor é separada em uma máquina física, que chamamos de nós. Em qualquer momento, um nó serve como o nó principal do replica set e um ou mais nós servirão como componentes secundários que chamamos isso de replicação mestre-escravo como em outros bancos de dados. Onde o nó mestre de um replicar set pode aceitar ler e escreve, porém, os nós escravos só permitem a sua leitura. O que torna uma réplica única é o seu apoio para failover automatizado. Caso o nó primário falhar, o cluster irá escolher um nó secundário e automaticamente promovê-lo para um nó primário e quando o outro nó primário voltar a funcionar ira ser tornar um nó secundário, como demonstrado na figura 4:

replica

Figura 4 — Exemplo de Réplica Set. Fonte: Shakuntala Gupta Edward, Navin Sabharwal., 2015, p.99

SHARDING

Segundo Banker, Kyle. et al (2016) sharding é o processo particionamento de um grande conjunto de dados menor e mais manejáveis. A maioria das aplicações, os armazenamentos dos dados completos são fixados em cada servidor que é perfeitamente aceitável. Porem na medida em que o tamanho dos dados cresce, a aplicação ira exigir uma maior leitura e gravação de suas transferências para os servidores e isso pode não ser o suficiente. Particularmente, os servidores podem não ser capazes de estar lidando com memória ram e núcleos de CPU suficientes para processar a carga de trabalho de uma maneira eficiente.

Banker, Kyle. et al (2016) explica que, o sistema de sharding lida com uma adição de nós de shard que facilita o failover automático. Segundo ele, os shards individuais são compostos por um conjunto de repicas que consiste em dois nós pelo menos, assim garantindo a sua recuperação automática com nenhum ponto único de falha. Isso significa que nenhum código da aplicação tenha que lidar com essas logísticas, que o código deve se comunicar com um cluster sharded, ou seja falar somente com um único nó.

Chodorow (2013) explica dois tipos de sharding, o manual e o auto. Onde o shardig manual pode ser feito qualquer software de banco de dados, em que uns aplicativos mantem conexões para vários servidores de banco de dados diferentes, cada um dos quais são completamente independes. A aplicação gera o armazenamento de dados diferentes em servidores diferentes e consultando contra o servidor apropriado para se obter os dados de volta. Segundo ela, esta abordagem pode funcionar muito bem, porem torna-se difícil manter ao adicionar ou remover nós do cluster ou em fase de mudança de distribuições de dados ou padrões de carga. Já o auto-sharding, tenta ter uma distância abstrata da arquitetura da aplicação e simplificar a administração de um sistema. O Mongodb permite que a aplicação ignore de fato de não está falando com um servidor MongoDB autônomo. Já no lado operacional, o Mongodb automatiza o balanceamento de dados shards, para tornar mais fácil para adicionar e remover capacidades.

TIPOS DE DADOS

O MongoDB suporta uma gama de tipo de dados para os documentos no formato binário do JSON, chamada BSON, umas listas mais completas dos outros tipos podem ser vistas em sua documentação, os tipos mais comuns segundo Marchioni (2015, p.11) são:

  • String: É o tipo mais comum de dados, já que contém uma sequência de texto.
  • Integer (32 bit e 64-bit): Usado para armazenar um valor numérico.
  • Boolean: Usado para armazenar um True ou False.
  • Double: Usado para armazenar valores de ponto flutuantes.
  • Min/Max Keys: É utilizada para comparar um valor contra o menor e maior elementos do BSON mais elevados respectivamente.
  • Array: É usado para armazenar matrizes ou lista de valores múltiplos em uma única chave.
  • TimeStamp: Este tipo é utilizando quando armazenamos uma data e hora.
  • Object: Usado para armazenar documentos incorporados.
  • Null: Utilizado para valores nulos.
  • Symbol: Ele permite armazenar caracteres como String. Geralmente é utilizado por idiomas que utilizam um tipo de símbolo especifico.
  • Date: Armazena a data ou a hora atual.
  • ObjectID: Utilizado para armazenar o documento de ID.
  • Binary Data: Utilizado para armazenar um conjunto de dados binários.
  • Regular Expression: Utilizado para expressões regulares. Todas as opções são representadas por caracteres específicos previsto em ordem alfabética.
  • JavaScript code: Utilizado para códigos em JavaScript.

Neste capitulo vimos de maneira geral as características e as vantagens de se está utilizando o MongoDB como parte para novos projetos ou até mesmo trabalhar em conjunto com os bancos relacionais.

Definimos também os elementos núcleo do MongoDB de como é armazenada os dados, que são documentos em JSON mais em sua forma binaria e que um conjunto de documentos forma uma coleção e ela se torna um banco de dados e que em um único banco de dados MongoDB pode contém várias coleções de documentos contendo diferentes tipos de dados.

Foram apresentados os conceitos sobre índices e os seus variados tipos índices e que os mesmo são implementados por uma estrutura de dados em arvores-B. Vimos também o conceito sobre replicação de dados do MongoDB, que é uma forma de manter copias idênticas dos dados e que é recomenda sua utilização para todas as implantações de produções e a utilização da replica set, onde consiste em muitos servidores Mongo separadas por uma maquina física e que chamamos de nós.

Além disso, foi apresentado o sharding, que é o processo de particionar uma grande quantidade de dados, onde o mesmo lida com a adição de nós de shard que facilitam um failover automático.
Foram visto também os tipos básico de dados que o MongoDB trabalha para seus documentos no formato JSON, porem em sua forma binaria chamada BSON.

REFERÊNCIAS

Banker, Kyle; et al. MongoDB in Action, Second Edition. Shelter Island: Manning, 2016.

Chodorow, Kristina. MongoDB The Definitive Guide, 2nd Edition. Gravenstein Highway North: O’Reilly, 2013.

IBM — Lennon, Joe. Explore o MongoDB. 2011. Disponível em: < https://www.ibm.com/developerworks/br/library/os-mongodb4 / > Acesso em: 11 de maio 2016.

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.

MongoDB. MongoDB Architecture. 2016. Disponível em:< https://www.mongodb.com/mongodb-architecture >. Acesso em: 17 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 .