2012-04-11 30 views
5

我在操作中嵌套多個雙操作數$or操作時遇到問題。 this discussion的結論聽起來類似於我所需要的,但我無法使其發揮作用。這裏是我想要做的事情的JavaScript:

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

這在MongoDB交互式shell中起作用。

而且這裏的一些PHP看起來OK我,但不工作(導致其中表示無限遞歸):

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

任何想法?

Crossposted here

回答

10

這聽起來像你需要建立一個單獨的子查詢,然後將其添加到$q

$q->addAnd(...)立即進行評估並將其自身添加到$q,但您希望它等待。

我沒有安裝這個軟件包,所以我無法測試,但這只是一個預感。希望能幫助到你。

$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

這是它到底!謝謝!添加' - > expr()'確實會延遲添加'$或'表達式直到適當的時間。 – 2012-04-24 00:02:21

0

您可以嘗試如下:

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