Data

24 jun, 2010

Como utilizar selects com MongoDB

Publicidade

Veremos hoje como
podemos pensar nas consultas para o MongoDB a partir das nossas sqls
normais. Para entendermos melhor como se faz uma consulta no MongoDB,
vamos olhar este código:

$filter = array( "nome" => "Jean Nascimento" );

$cursor = $collection->find($filter);

foreach ($cursor as $obj) { echo $obj["nome"]. " - " . $obj["_id"] . "<br />"; }

Percebe-se que a variável $filter
receberá um parâmetro que filtrará nossa busca. No caso, ela buscará
os objetos que possuem o nome = ‘Jean Nascimento’. A variável
$cursor receberá o resultado através da função find(). E o
foreach mostrará os elementos achados.

Vamos começar com um select básico
que pesquisará tudo onde o nome for igual a Jean Nascimento:

select
* from tabela where nome = 'Jean Nascimento'

Nosso correspondente em MongoDB
será:

 $filter
= array( "nome" => "Jean Nascimento" );

Agora
vamos usar o operador LIKE
do SQL
 para procurar pelas ocorrências que
comecem com J e possuam 4 caracteres como Jean, João, José:

select
* from tabela where nome LIKE 'J___ Nascimento'

O
correspondente em MongoDB será:

$filter
= array( "nome" => new MongoRegex('/^J[a-Z]{3}
Nascimento/i' );

Como vimos acima,
devemos usar a função MongoRegex para
filtrar campos com string no MongoDB. Pelo nome fica fácil de
entender que ela se utiliza de expressões
regulares
para procurar as strings. Aconselho a terem
pelo menos uma base de expressões regulares para poderem utilizar o
poder desse filtro. 

Vamos a mais uns exemplos. 

Este select pesquisará todos os
nomes que possuam Nasc no seu valor:

select
* from tabela where nome LIKE '%Nasc%'

O seu correspondente no nosso filtro
será:

$filter
= array(   'title' => new MongoRegex('/.Nasc./i') );

Agora, além dos operadores básicos
de igualdade e LIKE, podemos utilizar outros operadores como: IN, NOT
IN, >, >=, <, <= e <>.

Vou dar um exemplo de cada:

SQL:
select * from usuarios where UsuarioID IN (2,14,16)
MongoDB: $filter
= array("UsuarioID" => array('$in' =>
array(2,14,16)));
SQL: select
* from usuarios where UsuarioID NOT IN (2,14,16)
MongoDB: $filter
= array("UsuarioID" => array('$nin' =>
array(2,14,16)));
SQL: select
* from usuarios where UsuarioID > 33
MongoDB: $filter
= array("UsuarioID" => array('$gt' => 33));
SQL: select
* from usuarios where UsuarioID >= 33
MongoDB: $filter
= array("UsuarioID" => array('$gte' => 33));
SQL: select
* from usuarios where UsuarioID < 33
MongoDB: $filter
= array("UsuarioID" => array('$lt' => 33));
SQL: select
* from usuarios where UsuarioID <= 33
MongoDB: $filter
= array("UsuarioID" => array('$lte' => 33));
SQL: select
* from usuarios where UsuarioID <> 33
MongoDB: $filter
= array("UsuarioID" => array('$ne' => 33));

E se nós quisermos inserir algum
dado no MongoDB? Imagine a query:

insert into usuario(login, email)
VALUES('sissa', 'jnascimento@gmail.com')

Para utilizarmos o insert no MongoDB
com a sua extensão habilitada no PHP, criamos o array com os valores
que vamos inserir:

$query = array(
'usuario' => "suissa",
'email' => "jnascimento@gmail.com"

);

Depois disso, é só chamar o
insert. 

$db->collection->insert($this->query);

Esta instrução
equivale à sql:

insert
into usuario(UsuarioID, Usuario, Email) VALUES(1, "suissa",
"jnascimento@gmail.com")

Atualizar
registros no MongoDB é praticamente igual, porém, precisamos passar
o parâmetro da busca. Apesar desse exemplo simples, e mais comum, os
filtros dos selects muitas vezes devem ser utilizados para fazer
atualizações nos registros. 

$db->collection->update(array('_id'
=> new MongoID($mongo_id)), array('$set' => array('Tarefa' =>
'Terminar artigo')));

Como podemos perceber, a primeira
parte, array(‘_id’ => new
MongoID($mongo_id)), é o filtro da busca, podendo ser
modificado para filtrar por qualquer campo existente. A segunda
parte, array(‘$set’ =>
array(‘Tarefa’ => ‘Terminar artigo’)), nos diz respeito ao
valor que vamos alterar .

Agora a seguinte sql:

update tarefas
set Tarefa='Terminar artigo' where Usuario='suissa' 

Ficará:

$db->collection->update(array('Usuario'
=> 'suissa'), array('$set' => array('Tarefa' => 'Terminar
artigo')));

O operador $set, pode ser alterado
para $inc, que fará com que o MongoDB incremente automaticamente o
valor especificado para mais ou para
menos:

$db->collection->update(array('_id' => new MongoID($mongo_id)), array('$inc' => array('Visitas' => 1), false); //incrementa com +1
$db->collection->update(array('_id' => new MongoID($mongo_id)), array('$inc' => array('Visitas' => 5), false); //incrementa com +5
$db->collection->update(array('_id' => new MongoID($mongo_id)), array('$inc' => array('Visitas' => -1), false); //retira 1
$db->collection->update(array('_id' => new MongoID($mongo_id)), array('$inc' => array('Visitas' => -5), false); //retira 5

Excluir um
registro:

$db->collection->remove(array('_id'=> new MongoID($mongo_id)));
$db->collection->remove(array('Usuario'=> 'suissa'));

Também levando em conta que você
pode usar algumas propriedades usadas no select para remover
registros em grupos.

Com isso, nós já estamos aptos a
programar e a interagir com o MongoDB de inúmeras formas.

Até a próxima!