Introdução ao MongoDB

logo-mongodb-onwhite

Se você sabe o que é JSON, banco de dados relacional, tem pelo menos uma vaga ideia do que vem a ser NoSQL e quer saber o que é o MongoDB, este post vai te ajudar a saber por onde começar.

O MongoDB é um banco de dados não relacional (também conhecido como NoSQL) para armazenamento de documentos no formato JSON. Isso significa que no Mongo os dados não são armazenados em tabelas (linhas e colunas), mas em um formato mais livre e o baixo nível de normalização é tolerado e em certos casos até incentivado.

Este é um exemplo de um documento em JSON:

{"nome" : "Elvis" }

Este é outro exemplo de um documento JSON:

{ "a" : 5,
"b" : 7,
"lista" : ['abc', 1, 'maçã'] }

Qualquer um desses dois exemplos de um documento JSON podem ser armazenados em um banco de dados do Mongo. Isso porque o Mongo é schemaless, ou seja, não tem um padrão definido para armazenamento dos dados.

MongoDB não tem suporte a joins (relacionamento entre coleções), nem tem suporte a transações, uma vez que todas as operações são atômicas, exatamente por não suportar relacionamento entre suas coleções. Todos os comandos dentro do servidor são executados em JavaScript.

Para iniciar o servidor do MongoDB, faça o download da última versão estável para o seu sistema operacional e execute o arquivo mongod para inicializar o servidor (lembre-se de criar o diretório datadb antes de iniciar o servidor) e execute o arquivo mongo para iniciar o shell do MongoDB.

Alguns comandos iniciais para manipulação dos dados no servidor:

// Indica ao servidor que vamos trabalhar em um banco de dados chamado 
// "teste". Se ele não existir, será criado após a execução deste comando
use teste

// Salva um documento JSON na coleção "coisas" dentro do banco de 
//dados que estamos trabalhando, ou seja, "teste"
db.coisas.save( {a: 1, b: 2, c: 3} )

// Salva outro documento JSON na mesma coleção que o documento 
// anterior. Repare que este documento tem atributos a mais que o 
//documento anterior - o que seria impossível fazer em um RDBMS.
db.coisas.save( {a: 1, b: 2, c: 3, d: 4} )

// Lista todos os documentos armazenados no banco
db.coisas.find()

// Mostra o mesmo resultado do comando anterior, mas com uma 
// formatação mais amigável
db.coisas.find().pretty()

Um recurso interessante sobre o servidor: se você quiser saber como funciona a função save, por exemplo, execute o comando db.coisas.save sem parênteses. Isso fará que o mongoshell mostre o código fonte dessa função, uma vez que, para ser executada, a função deve ter parênteses e eventualmente receber algum parâmetro. Veja o que aparece após executar db.coisas.save:

// > db.names.save
function ( obj ){
    if ( obj == null || typeof( obj ) == "undefined" )
        throw "can't save a null";

    if ( typeof( obj ) == "number" || typeof( obj) == "string" )
        throw "can't save a number or string"

    if ( typeof( obj._id ) == "undefined" ){
        obj._id = new ObjectId();
        return this.insert( obj );
    }
    else {
        return this.update( { _id : obj._id } , obj , true );
    }
}

Analisando a função acima fica fácil perceber qual mensagem vai aparecer se você tentar executar a função save passando um número como parâmetro (linha 6, destacada no código): can't save a number or string. Isso facilita quando você está estudando uma nova linguagem ou framework.

Os documentos armazenados no Mongo podem conter subdocumentos, que podem ser comparados aos relacionamentos em um SGBD. Por exemplo, uma coleção de posts de um blog pode ter os comentários como subdocumentos de cada post. Em um SGBD existiria uma tabela separada para os comentários. No caso do Mongo, a melhor alternativa é armazenar os comentários como subdocumentos pois muito raramente você precisará acessar um comentário sem se referir primeiramente ao post.

Uma última nota importante nesta introdução ao Mongo: cada documento armazenado em uma coleção não pode ter mais que 16MB. Isso significa que se você precisar armazenar mais de 16MB de comentários para um post do seu blog no Mongo (o que é improvável), você não terá outra opção a não ser colocar os comentários em uma coleção separada.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *