Как сделать ИЛИ выполнить поиск

#php #mongodb #find #partial

#php #mongodb #Найти #частичный

Вопрос:

Я хочу выполнить поиск частичного совпадения имени и фамилии — например, в sql

 f_name LIKE J%   OR  l_name LIKE S%   
  

будет соответствовать Джону Смиту, или Джону Генри, или Гарри Смиту.

Я предполагаю, что мне может понадобиться использовать оператор «$or»,

У меня есть это до сих пор, что, как я полагаю, правильно выполняет часть LIKE%, но я полагаю, что он выполняет поиск «И» (что означает, что он ищет f_name КАК J% И l_name КАК S%, поэтому он будет соответствовать только John Smith):

 $name1="J";
$name2="S";
$cursor = $this->clientCollection->find(array('f_name' => new MongoRegex('/^'.$name1.'/i'), 'l_name' => new MongoRegex('/^'.$name2.'/i') ));
  

Примечание: Это будет соответствовать содержимому as в %J%

 MongoRegex('/'.$name1.'/i')
  

Это совпадение будет начинаться с (обратите внимание на добавленный ^), как в J%

 MongoRegex('/^'.$name1.'/i')
  

Ответ №1:

$or принимает массив предложений, поэтому вам в основном просто нужно обернуть другой массив вокруг вашего текущего запроса:

 array('$or' => array(
    array('f_name' => new MongoRegex('/'.$name1.'/i')), 
    array('l_name' => new MongoRegex('/'.$name2.'/i'))
));
  

Редактировать: в предыдущем примере пропущен внутренний набор array() вызовов.

Исходный, неправильный пример, который я опубликовал, выглядел следующим образом:

 array('$or' => array(
    'f_name' => new MongoRegex('/'.$name1.'/i'), 
    'l_name' => new MongoRegex('/'.$name2.'/i')
));
  

Это допустимый запрос, но не полезный. По сути, части f_name и l_name запроса по-прежнему объединены, поэтому $or часть бесполезна (передается только один запрос, так что это то же самое, что просто запускать этот запрос сам по себе).

Что касается альтернативы, которую вы упомянули в своем комментарии, она не работает, потому что самый внешний массив в запросе должен быть ассоциативным массивом. Путаница возникает из-за того, что синтаксис запросов Mongo похож на JSON и использует смесь объектов и массивов, но обе эти структуры представлены в PHP массивами. Драйвер PHP Mongo в основном преобразует ассоциативные массивы PHP в объекты JSON ( { ... } ), а «обычные» массивы PHP в массивы JSON ( [ ... ] ).

Практический результат заключается в том, что «обычные» массивы PHP обычно допустимы только внутри ассоциативного массива, например, при указании нескольких значений для поля. Следующий пример из руководства по PHP Mongo показывает допустимое использование «обычного» массива в запросе:

 $cursor = $collection->find(array("awards" => array('$in' => array("gold", "copper"))));
  

Комментарии:

1. Это работает, но мне просто интересно, почему внутренний набор вызовов array? Исходный код работает, он возвращает записи как И. Я попытался использовать изменение кода на $cursor = $this-> clientCollection-> find(массив(array(‘f_name’ => новый MongoRegex(‘/’.$name1.’/ i’)),array(‘l_name’ => новый MongoRegex(‘/’.$name2.’/ i’)) )); и это не работает, но в вашем случае это работает с ‘$ or’.

2. Я пытался объяснить, что здесь происходит. К сожалению, из-за всех этих PHP array() -ов довольно сложно определить, что происходит в запросе Mongo в PHP, особенно с первого взгляда.