2012-04-11 12 views
5

Tengo problemas para anidar operaciones de varios operandos múltiples $or dentro de una operación $and. La conclusión de this discussion suena similar a lo que necesito, pero no puedo hacer que funcione. Aquí está el JavaScript de lo que trato de hacer:

db.Business.find(
    { 
    $and: 
     [ 
     { $or: [{nm: /American/}, {dsc: /American/}] }, 
     { $or: [{nm: /Mega/}, {dsc: /Mega/}] } 
     ] 
    } 
) 

Eso funciona en el shell interactivo de MongoDB.

Y aquí es algo de PHP que se ve bien para mí, pero no funciona (hace que la recursividad infinita cuando se indique):

$q = $doctrineOdm->createQueryBuilder('Business'); 
foreach (array('American','Mega') as $keyword) { 
    $r = new \MongoRegex('/'.$keyword.'/i'); 
    $q->addAnd(
    $q->addOr($q->expr()->field('nm')->equals($r)) 
     ->addOr($q->expr()->field('dsc')->equals($r)) 
); 
} 
print_r($q->getQuery()->getQuery()); // infinite recursion 
$cursor = $q->getQuery()->execute(); 

¿Alguna idea?

Crossposted here.

Respuesta

10

Parece que necesita crear una subconsulta por separado antes de agregarla a $q.

$q->addAnd(...) se evalúa inmediatamente y se agrega al $q, pero desea que espere.

No tengo este paquete instalado, así que no puedo probar, pero esto es sólo una corazonada. Espero eso ayude.

$q = $doctrineOdm->createQueryBuilder('Business'); 
foreach (array('American','Mega') as $keyword) { 
    $r = new \MongoRegex('/'.$keyword.'/i'); 
    $q->addAnd(
    $q->expr()->addOr($q->expr()->field('nm')->equals($r)) 
       ->addOr($q->expr()->field('dsc')->equals($r)) 
); 
} 
print_r($q->getQuery()->getQuery()); // infinite recursion 
$cursor = $q->getQuery()->execute(); 
+0

Eso era exactamente! ¡Gracias! Agregar '-> expr()' de hecho retrasa la adición de la expresión '$ o' hasta el momento apropiado. –

0

Usted puede tratar de la siguiente manera:

$filters = array(
    new \MongoRegex('/American/i'), 
    new \MongoRegex('/Mega/i') 
); 
$q = $doctrineOdm->createQueryBuilder('Business') 
       -> field('nm') ->in($filters) 
       -> field('dsc') ->in($filters); 

print_r($q->getQuery()->getQuery()); // infinite recursion 
$cursor = $q->getQuery()->execute(); 
Cuestiones relacionadas