Se você desenvolve aplicações para web, provavelmente
utiliza banco de dados relacionais. Nascida há mais de 40 anos, essa estrutura domina o mercado da persistência e dificilmente
encontraremos outra forma segura de relacionamentos de dados, transações e etc.
Porém com o crescimento da web e a
expansão do volume de dados que nela circula, surgiram algumas necessidades
básicas :
- Performance
- Grafos (cruzamentos de informações)
- Escalonamento ( possibilidade de expansão horizontal )
- Evitar Single Point of Failure (falha de conexão com os dados)
Para simplificar a complexibilidade da modelagem dos bancos
de dados relacionais, e atender as necessidades supracitadas, surgiu um movimento chamado NOSQL. (Not Only SQL).
O objetivo desse movimento
não é substituir a modelagem relacional, mas adicionar recursos que não são
encontrados na mesma. Podemos concluir que NOSQL são sistemas de armazenamentos
capazes de suprir necessidades de demandas onde os bancos de dados relacionais são muito restritos.
Dentre as
inúmeras vantagens do NOSQL, podemos citar o alto desempenho de queries,
segurança de dados, escalabilidade, tolerância
à falha, e por não possuir
estrutura definida (schema-free) possui maior flexibilidade na inclusão de
dados. Falarei com mais detalhes de todas essas características em futuros posts.
Em
2007, uma empresa de desenvolvimento web,
chamada 10gen, começou trabalhar com uma base de dados que pudesse ser
escalada de acordo com a necessidade.
Surgiu então o MongoDB utilizando como modelagem de dados orientada a
documentos (Json).
Apesar da resistência natural das empresas que utilizam o
sistema tradicional de banco de dados relacionais e neles confiam, atualmente
grandes empresas já utilizam NOSQL em
seus sistemas, como por exemplo:

*******
SERVIDOR
1. Para
instalar o MongoDB você pode clicar aqui e escolher o seu sistema operacional. Feito a instalação, e criada a variável de
ambiente (opcional), mostrarei como ter o primeiro exemplo de uma base de
dados no MongoDB.
Antes subir o servidor do mongo vá até a raiz da unidade C:\ e crie uma pasta chamada data. Dentro dela, crie outra pasta chamada db. Por default, MongoDB armazena arquivos no diretório /data/db.
Em todas as plataformas, MongoDB “ouve” conexões com os clientes na porta 27017 (default). Se você quiser utilizar outro diretório basta especificar outro path quando for levantar o servidor adicionando --dbpath <path >. Assim como pode utilizar outra porta com o comando --port <número da porta>.
2. Agora você está pronto para subir o servidor do Mongo. Digite no shell o comando mongod. Serão exibido os seguintes dados da conexão:
paulo@paulo-HP-Pavilion-dv6-Notebook-PC:~$ mongod --dbpath /home/paulo/dat
Tue Oct 8 22:56:28 [initandlisten] MongoDB starting : pid=4069 port=27017 dbpath=/home/paulo/dat 64-bit host=paulo-HP-Pavilion-dv6-Notebook-PC
Tue Oct 8 22:56:28 [initandlisten] db version v2.0.6, pdfile version 4.5
Tue Oct 8 22:56:28 [initandlisten] git version: nogitversion
Tue Oct 8 22:56:28 [initandlisten] build info: Linux batsu 3.2.0-23-generic #36-Ubuntu SMP Tue Apr 10 20:39:51 UTC 2012 x86_64 BOOST_LIB_VERSION=1_49
Tue Oct 8 22:56:28 [initandlisten] options: { dbpath: "/home/paulo/dat" }
Tue Oct 8 22:56:28 [initandlisten] journal dir=/home/paulo/dat/journal
Tue Oct 8 22:56:28 [initandlisten] recover : no journal files present, no recovery needed
Tue Oct 8 22:56:28 [websvr] admin web console waiting for connections on port 28017
Tue Oct 8 22:56:28 [initandlisten] waiting for connections on port 27017
Atente-se para a linha "... waiting for connections on port 27017" informando que o servidor está pronto para uma conexão com o cliente.
3. Abra um outro shell e digite o comando mongo e pronto, você terá no seu shell acesso ao
banco de dados default “test”.
4. Para encerrar o servidor basta digitar Control+C no shell do servidor, ou no shell do mongo digite use admin e o comando db.shutdownServer().
4. Para encerrar o servidor basta digitar Control+C no shell do servidor, ou no shell do mongo digite use admin e o comando db.shutdownServer().
BASE DE DADOS
Por ser schema-free você não precisar criar um banco de dados antecipadamente com tabelas pré-definadas, basta definir a base de dados que deseja utilizar. Se a mesma já existir será carregada no servidor, caso contrário uma nova será criada automaticamente.
1. Vamos criar um banco de dados como exemplo. Digite use escola
paulo@paulo-HP-Pavilion-dv6-Notebook-PC:~$ mongo MongoDB shell version: 2.0.6 connecting to: test use escola switched to db escola2. Ao criar o banco de dados "Escola" já pode adicionar o documento desejado. O comando para inserir é db.escola.insert(< documento>); Exemplo:
db.escola.insert({_id:01,materia:"portugues",turma:03,professor:"Jose Antonio",idade_professor:25})
db.escola.insert({_id:02,materia:"matematica",turma:06,professor:"Aline Ferreira",idade_professor:29})
db.escola.insert({_id:03,materia:"Fisica",turma:08,professor:"Sabrina Lima",idade_professor:34})
db.escola.insert({_id:03,materia:"Fisica",turma:08,professor:"Sabrina Lima",idade_professor:34})
db.escola.insert({_id:04,materia:"Geometria",turma:09,professor:"Fabiana Moraes",idade_professor:30})
3. Uma das grandes vantagens da modelagem NOSQL está no schema-free. No exemplo anterior poderia ocorrer de um professor não ter uma turma definida ainda. No banco de dados relacional teríamos que adicionar um campo null. Em MongoDB basta adicionar o documento sem esse campo e por ser schemaless, o mesmo será adicionado no banco “escola”.
db.escola.insert({_id:04,materia:"Geometria",professor:"Claudio Ribeiro",idade_professor:30})
4. Assim como poderíamos querer salvar para um determinado professor um atributo a mais.
db.escola.insert({_id:06,materia:"Inglês",turma:09,professor:"Marcio Santos",idade_professor:30,cargo_adicional:”coordenador”}).
5. O comando db.escola.find() mostra todos os dados do banco.
db.escola.find()
{ "_id" : 1, "materia" : "portugues", "turma" : 3, "professor" : "Jose Antonio", "idade_professor" : 25 }
{ "_id" : 2, "materia" : "matematica", "turma" : 6, "professor" : "Aline Ferreira", "idade_professor" : 29 }
{ "_id" : 3, "materia" : "Fisica", "turma" : 8, "professor" : "Sabrina Lima", "idade_professor" : 34 }
{ "_id" : 4, "materia" : "Geometria", "turma" : 9, "professor" : "Fabiana Moraes", "idade_professor" : 30 }
E o comando db.escola.find().pretty() mostra os mesmos dados em formato de documento chave-valor.
db.escola.find().pretty()
{
"_id" : 1,
"materia" : "portugues",
"turma" : 3,
"professor" : "Jose Antonio",
"idade_professor" : 25
}
{
"_id" : 2,
"materia" : "matematica",
"turma" : 6,
"professor" : "Aline Ferreira",
"idade_professor" : 29
}
{
"_id" : 3,
"materia" : "Fisica",
"turma" : 8,
"professor" : "Sabrina Lima",
"idade_professor" : 34
}
{
"_id" : 4,
"materia" : "Geometria",
"turma" : 9,
"professor" : "Fabiana Moraes",
"idade_professor" : 30
}
6. Para localizar um dado inserido, existem várias sintaxes de queries. Por exempplo : digite db.escola.find({_id:03}) e irá encontrar no banco chamado escola o arquivo com o id 03.
db.escola.find({_id:03})
{ "_id" : 3, "materia" : "Fisica", "turma" : 8, "professor" : "Sabrina Lima", "idade_professor" : 34 }
Outras queries podem ser mais específicas como db.escola.find({"idade_professor":{$gt:29}}) que encontra os professores com idade maior que 29 anos:
db.escola.find({"idade_professor":{$gt:29}})
{ "_id" : 3, "materia" : "Fisica", "turma" : 8, "professor" : "Sabrina Lima", "idade_professor" : 34 }
{ "_id" : 4, "materia" : "Geometria", "turma" : 9, "professor" : "Fabiana Moraes", "idade_professor" : 30 }
Dentre os inúmeros operadores de busca estes são os mais comuns: $gt(maior que), $gte(maior ou igual que), $lt (menor que) $lte (menor ou igual que), $ne(diferente), $in e &nin (está e não está em uma base de dados, respectivamente).
7. Para alterar os dados:
db.escola.update({professor:"Aline Ferreira"},{$set:{turma:7}})
O primeiro campo faz a query e encontra o professor com nome "Aline Ferreira" e altera o campo determinado no $set.
8. Para excluir um determinado campo :
db.escola.remove({_id:1})
Nos próximos posts falarei sobre otimização de queries com Index; os driver do MongoDB para a linguagem Java (faremos um CRUD em java utilizando a base de dados do MongoDB).Até breve.



