Introdução ao MongoDB

O MongoDB é, de longe, o mais javascript da nova geração de bancos de dados. Trata-se de um banco de dados cuja estrutura de armazenamento se baseia em documentos que, por sua vez, são compostos de pares do tipo key/value. Esta arquitetura mimetiza a definição de objetos utilizada no javascript e de comunicação de dados utilizada no json. Se não for suficiente, o MongoDB utiliza a sintaxe do javascript como shell para a realização de todas as operações com o banco. Logo do mongodb

Bancos de dados NoSql

Bancos de dados NoSql são estruturas de armazenamento e recuperação de dados que fogem da estrutura comum aos bancos de dados que usam a linguagem sql, baseada em tabelas e colunas, popularizada nos anos 90 do século passado e que hoje permeiam a internet em sistemas baseados no MySql, por exemplo.

Notadamente em busca de uma solução que seja mais rápida, principalmente durante a leitura, fuja das estruturas normalizadas eliminando os joins e se aproxime de um modelo mais natural de representação da informação. O que, em poucas palavras, fica na classe do “você vai ter que aprender tudo de novo”..

Originalmente NoSql representava, em inglês, a expressão Sem SQL, agora está mais para Não apenas SQL já que algumas tecnologias incluem o SQL.

Esta definição, ainda que bonitinha, esconde um número significativo de tecnologias para armazenamento e recuperação de informações que vão deste estruturas capazes de armazenar documentos, como o MongoDB, até tecnologias que utilizam apenas estruturas do tipo key/value como o Hadoop.

A escolha entre um banco SQL tradicional ou uma das tecnologias NoSql, depende do desenvolvedor, do aplicativo e da capacidade de investimento envolvida no projeto.Ainda assim, se observarmos apenas estatisticamente, as tecnologias NoSql estão dominando o mercado.

Um banco de dados é definido, primordialmente, pelo seu modelo de dados. O MongoDb é baseado em estruturas de key/value, organizados em documentos, organizados em coleções e estas organizadas em bancos de dados.

Esquema de um banco de dados típico em MongoDB  Cortesia MongoDB'

Esquema de um documento típico em MongoDB Cortesia MongoDB

crud-annotated-collection

Esquema de uma coleção típica em MongoDB Cortesia MongoDB’

Esta estrutura é, fundamentalmente aberta. Bancos de dados não determinam como as coleções devem ser, uma coleção não define o formato dos documentos e estes não são determinam como os pares key/Value devem ser utilizados.

Documentos

Um documento é a unidade básica de armazenamento usada no MongoDB. Trata-se, essencialmente, de um conjunto ordenado de pares key/value (ou chave/valor). Com uma sintaxe compatível, e muito parecida, com a sintaxe usada para a definição de objetos em javascript e para a transferência destes mesmos objetos via protocolo JSON.

No caso dos documentos (documents) utilizados no MongoDB estes pares são sensíveis ao tipo primitivo do valor e ao uso de letras maiúsculas. Podendo conter valores dos tipos numbers, strings, boolean, dates, arrays e até mesmo documentos embarcados.

[javascript]<br />//documento válido<br />{nome:"depijama", end: "http://www.depjama.com", valor: 12.35}<br />{valor: 3} // diferente de {Valor:3} e de {valor:"3"}<br />//exemplo de documento embarcado&lt;br<br />{<br />"usuario" : "Zé das Couves",<br />"enderec1" :<br />"rua" : "R. Sem Sombra, 123",<br />"cidade" : "Quente para Dedéu",<br />"estado" : "RJ"<br />}<br />}<br />[/javascript]

Na literatura, não é raro nos referimos aos campos como valores propriedades ou atributos, dependendo do contexto.

O conjunto de tipos de dados que podem ser utilizados nos campos de um documento MongoDB é maior que o disponível para o javascript. Estes tipos primitivos extras foram adicionados para facilitar o uso de informações comumente encontradas em bancos de dados. Observe que a ordem dos pares key/value importa para diferenciar documentos.

Sendo assim, o documento:

[javascript]<br />{valor1: "a", valor2: "b"}<br />[/javascript]

É diferente do documento:

[javascript]<br />{valor2: "b", valor1: "a"}<br />[/javascript]

Não projete sistemas cuja ordem dos pares seja importante. O MongoDB pode ordenar estes pares automaticamente, criando sérios constrangimentos. Principalmente na frente de chefes, gerentes, diretores, clientes e namoradas.

Observe que existem algumas restrições quanto aos caracteres que podem ser utilizados na criação de um valor (key). Teoricamente você pode utilizar qualquer caractere UTF-8 exceto o \0 mas, existem limitações quanto ao uso do $ que veremos em outro momento. Não utilize também o _id como valor (key) o MongoDB utilizará este valor como index e irá inserir um valor _id do tipo object quando você criar um documento.

Nada impede que você use um modelo de dados normalizado, exatamente como você faz com um banco SQL. Neste caso estes valores _id serão utilizados como referência entre documentos.

Coleções

Uma coleção é um conjunto de documentos.

Os esquemas de definição de cada coleção, no MongoDB, são dinâmicos ou seja, cada documento em uma determinada coleção pode ter o formato que o desenvolvedor desejar. Por exemplo, todos os documentos que utilizamos até aqui poderiam estar armazenados em uma mesma coleção.

Você pode pensar nas coleções como uma forma de organizar seu sistema.

Já que cada coleção pode ter um grande número de documentos, de qualquer formato, por que você deveria utilizar mais de uma coleção? Simplesmente para manter a casa em ordem. Imagine, por exemplo, que está fazendo um aplicativo de gestão de pessoas. Não seria interessante utilizar uma coleção para armazenar documentos pessoais e outra para legislação?

O nome da coleção pode conter qualquer combinação de caracteres UTF-8 exceto:

  • “”, você não pode usar o string vazio como nome de coleção;
  • \0, você não pode usar o caracter de fim de linha no nome da coleção;
  • $, o caracter $ não pode ser utilizado. Algumas coleções do MongoDB utilizam este caracter;
  • system., você não pode usar o prefixo system. na sua coleção ele é reservado pelo MongoDB.

Você também pode usar um ponto no nome da coleção (collection) assim você pode criar pessoal.doc  e pessoal.leg. Observe, contudo, que não há relação entre as coleções doc e pessoal, na verdade, a coleção pessoal sequer precisa existir. Isto é apenas uma forma de criar mnemônicos para suas coleções.

Bancos de dados

Bancos de dados (databases) são conjuntos de coleções. Uma única instância do MongoDB pode sustentar vários bancos de dados, cada um composto de várias coleções, cada uma composta de vários documentos. Cada  banco de dados possui seu próprio conjunto de regras de acesso e, via de regra, e está armazenado em um único arquivo no dispositivo de armazenamento. Um banco de dados é identificado por um nome único usando caracteres UTF-8 com as mesmas restrições de uso de caracteres dos nomes de coleções. Além destas restrições existem alguns nomes reservados: admin, local, config.

A relação entre o nome de um banco de dados e nome de uma coleção cria um namespace um nome qualificado que permite a localização dos documentos armazenados no MongoDB. A relação entre os bancos de dados, coleções deve ser feita com a notação ponto e limitada a 121 bytes. Assim, a coleção pessoal.doc do banco empresa deve ser referenciada por: empresa.pessoal.doc.