#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, особенно с первого взгляда.