MongoDB/doctrine: нельзя вкладывать $или в $и

У меня возникли проблемы с вложением нескольких операций $or с двумя операндами в операцию $and. Заключение этого обсуждения похоже на то, что мне нужно, но я не могу заставить его работать. Вот JavaScript того, что я пытаюсь сделать:

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

Это работает в интерактивной оболочке MongoDB.

И вот некоторый 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();

Любые идеи?

Отправлено здесь.


person Adam Monsen    schedule 11.04.2012    source источник


Ответы (2)


Похоже, вам нужно создать отдельный подзапрос, прежде чем добавлять его в $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();
person Joe Frambach    schedule 12.04.2012
comment
Это было точно! Благодарю вас! Добавление ->expr() действительно задерживает добавление выражения $or до нужного момента. - person Adam Monsen; 24.04.2012

Вы можете попробовать следующее:

$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();
person Duy Huynh    schedule 21.08.2015