MongoDB的/学说:不能嵌套$或$和(MongoDB/doctrine: can't n

2019-07-28 21:55发布

我无法嵌套多个双操作数$or一个范围内操作$and操作。 得出的结论讨论听起来类似我需要什么,但我无法得到它的工作。 下面是我想要做的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 。

Answer 1:

这听起来像你需要将它添加到以前建立一个独立的子查询$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();


Answer 2:

您可以尝试如下:

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


文章来源: MongoDB/doctrine: can't nest $or in $and