1. MUDE SEU JEITO
DE PENSAR
COM
MONGODB
Autor: Douglas Lira – douglas.lira.web@gmail.com
2. Antes de falar um pouco da minha experiência com o MongoDB, gostaria de
agradecer a oportunidade disponibilizada pelo Suissa para compartilhar essa informação
no NoSQLBr. Muito obrigado!!
Há meses estou submerso em um projeto que utiliza o MongoDB, foi escolhido
depois de uma longa discussão com a equipe, sua eficiência e agilidade de
processamento, quando bem configurado a coisa fica monstra. Porem me deparei com
um problema que deve afetar todos ao trabalhar com um banco de dados NoSQL a
FORMA DE SE PENSAR E PROJETAR o banco. Como sempre trabalhei com banco de
dados relacionais, projetei o MongoDB de forma idêntica a um banco de dados relacional
e ai começou a minha dor de cabeça. Estava tendo que tirar leite de pedra para alimentar
um monstrinho com muita fome, ou seja, tinha que ter um esforço fora do comum para
alimentar um aplicativo que exigia informações relacionadas e simples ao usuário final.
Por exemplo:
[Usuários] -> Onde são cadastrados todos os usuários.
[Amigos] -> Onde são cadastradas os relacionamentos dos amigos de cada
usuário.
Sendo assim em um banco relacional teríamos isso:
[Usuário] 1 -> N [Amigo]
Foi ai que deu inicio ao caos (rssss). Na hora de resgatar algumas informações
tinha um trabalho imenso e neste caso estava tendo que executar dois processos.
1 – Listar os ID’s que estavam na tabela de Amigos
2 – Verificar os ID’s encontrados no passo 1 e verificar suas informações
3. Em PHP seria algo assim:
<?php …
$collection = new MongoCollection($db, 'amigo');
$query = array('idUsuario' => new MongoId(123));
$list = $collection->find($query);
foreach ($list as $value) {
$temp[] = new MongoId($value->idAmigo);
}
…
$collection = new MongoCollection($db, 'usuario');
$queryAmigo = array('_id' => array('$in' => $temp));
$listAmigo = $collection->find($queryAmigo);
…
// Executaria dois processos… para algo relativamente simples, agora
// imagine um relacionamento envolvendo mais tabelas…
?>
Solução do problema:
<?php
$conexao = new Mongo(); // Iniciando uma conexão com o MongoDB
$db = $conexao->testandoomongo; // Criando uma base de dados
// Usuários inseridos.
$db->usuarios->insert(array("_id"=>1,"name"=>"User01"));
$db->usuarios->insert(array("_id"=>2,"name"=>"User02"));
$db->usuarios->insert(array("_id"=>3,"name"=>"User03"));
// Criando referencia de um usuario.
$infoUser = $db->usuarios->findOne(array('_id' => 2));
$refUser = $db->usuarios->createDBRef($infoUser);
// Adiciona a referencia
$db->usuarios->update(array('_id'=>1),array('$push'=>array('amigos'=> $refUser)));
// Consulta o usuario 1
$consulta = $db->usuarios->findOne(array("_id"=>1));
foreach ($consulta["amigos"] as $con) {
// pega a referencia do usuario
$ref = $db->usuarios->getDBRef($con);
print_r($ref);
}
?>
Então comecei a perceber que estava na hora de mudar a forma de pensar e de
utilizar o MongoDB. Quando pensar em MongoDB pense como se fosse um grande
objeto. Abaixo listei 3 dicas que não esquecerei jamais:
1 – Não utilize técnicas de banco relacional no MongoDB;
2 – Pense que as tabelas do MongoDB são grandes objetos que a qualquer
momento podem mudar sua forma “física”;
3 – Quando for programar tente ao máximo utilizar o raciocínio lógico, explorando
ao máximo seu objeto evitando o excesso de processamento do MongoDB.
4. Grande abraço a todos e fica a dica, qualquer coisa manda a dúvida que agente
discute e tentar encontrar a melhor solução. Valeuuu!!
Links: http://nosql.techinsider.com.br