2012-04-11 7 views
5

Ho difficoltà ad annidare più operazioni con due operandi $or all'interno di un'operazione $and. La conclusione di this discussion suona simile a quello di cui ho bisogno, ma non riesco a farlo funzionare. Ecco JavaScript di quello che sto cercando di fare:

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

Che funziona nella shell interattiva di MongoDB.

Ed ecco un po 'di PHP che sembra ok per me, ma non funziona (provoca ricorsione infinita dove indicato):

$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(); 

Tutte le idee?

Crossposted here.

risposta

10

Sembra che sia necessario creare una sottoquery separata prima di aggiungerla a $q.

$q->addAnd(...) viene valutato immediatamente e si aggiunge a $q, ma si desidera attendere.

Non ho questo pacchetto installato, quindi non posso testare, ma questo è solo un sospetto. Spero che sia d'aiuto.

$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

che è stato esattamente! Grazie! L'aggiunta di '-> expr()' rallenta davvero l'aggiunta dell'espressione '$ o' fino al momento appropriato. –

0

Si può provare come segue:

$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(); 
Problemi correlati