6

$or在一个$and操作中嵌套多个二操作数操作时遇到问题。这个讨论的结论听起来与我需要的相似,但我无法让它发挥作用。这是我正在尝试做的JavaScript:

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

这适用于 MongoDB 交互式 shell。

这里有一些对我来说看起来不错但不起作用的 PHP(在指示的地方导致无限递归):

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

有任何想法吗?

交叉张贴在这里

4

2 回答 2

11

听起来您需要先构建一个单独的子查询,然后再将其添加到$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();
于 2012-04-12T02:04:51.893 回答
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();
于 2015-08-21T08:55:29.080 回答