2016-01-14 2 views
0

Я работаю над супер простым поиском по нескольким полям документа, чтобы узнать, имеет ли какое-либо из них одно значение. (Примечание: в некоторых полях используется регулярное выражение для поиска, если значение содержится в строке). Используя построитель запросов, я построил следующее.Doctrine MongoDB Query Builder addOr query не возвращает никаких результатов

public function search($value, $limit, $offset=0, $orderby = '', $order='') 
{ 
    $regexVal = new \MongoRegex('/^.*(\b'.str_replace(' ', '\s', $value).'\b).*?$/i'); 

    $query = $this->repository->createQueryBuilder(); 

    $query->addOr($query->expr()->field('location')->equals($regexVal)); 
    $query->addOr($query->expr()->field('mappedData.name')->equals($regexVal)); 
    $query->addOr($query->expr()->field('mappedData.first_name')->equals($regexVal)); 
    $query->addOr($query->expr()->field('mappedData.last_name')->equals($regexVal)); 
    $query->addOr($query->expr()->field('mappedData.email')->equals($value)); 
    $query->addOr($query->expr()->field('email')->equals($value)); 
    $query->addOr($query->expr()->field('organization')->equals($value)); 

    $query->limit($limit) 
      ->skip($offset); 

    if(! empty($orderby) && $order){ 
     $query->sort($orderby, $order); 
    } 

    return $query->getQuery()->execute(); 
} 

Если я выгружаю построенные значения запроса, я получаю следующий массив в этом значении. https://gist.github.com/jchamb/04a0400c989cd28b1841 Дополнительное поле ассоциации добавлено фильтром Doctrine.

Через Query builder Я не получаю никаких результатов, однако, если я сам создаю запрос и запустил его в приложении администратора, например genghis, я получаю ожидаемый результат одного документа.

Настоящая письменная строка mongodb выглядит следующим образом. https://gist.github.com/jchamb/ce60829480576a88290d

Этот проект является приложением zend2, которое уже использовало доктрину и монго. Я не специалист по mongo в целом, поэтому я не уверен, что я делаю неправильно внутри Query Builder, что я не получаю тот же результат, что и выполнение запроса напрямую. Я не могу найти информацию о стеке или документах построителя запросов, которые также дают дополнительные подсказки для синтаксиса нескольких addOrs.

Любая помощь или направление было бы очень оценено, в самой базовой форме мне нужен построитель запросов, чтобы получить документ, где association = x и (field1 = val или field2 = value).

Спасибо!

ответ

0

Действительно неуверенный вопрос о том, что такое проблема с вышеуказанным, но после игры, переключение порядка построения запросов вокруг исправляет проблему.

public function search($value, $limit, $offset=0, $orderby = '', $order='') 
{ 
    $regexVal = new \MongoRegex('/^.*(\b'.str_replace(' ', '\s', $value).'\b).*?$/i'); 

    $query = $this->repository->createQueryBuilder() 
      ->find() 
      ->limit($limit) 
      ->skip($offset); 

    $query->addOr($query->expr()->field('location')->equals($regexVal)); 
    $query->addOr($query->expr()->field('mappedData.name')->equals($regexVal)); 
    $query->addOr($query->expr()->field('mappedData.first_name')->equals($regexVal)); 
    $query->addOr($query->expr()->field('mappedData.last_name')->equals($regexVal)); 
    $query->addOr($query->expr()->field('mappedData.email')->equals($value)); 
    $query->addOr($query->expr()->field('email')->equals($value)); 
    $query->addOr($query->expr()->field('organization')->equals($value)); 

    if(! empty($orderby) && $order){ 
     $query->sort($orderby, $order); 
    } 

    return $query->getQuery()->execute(); 
} 

Очень хотелось бы еще услышать отзывы о том, почему это работает, и выше, не, если кто-нибудь знает больше о внутренностях построитель запросов.

Смежные вопросы