Использование MongoDB с PHP Драйвер MongoDB Я не могу фильтровать результаты поиска с помощью регулярных выражений. В руководстве нет примеров того, как использовать опцию «фильтр»: MongoDB \ Driver \ Query.
$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
$filter = array(?????);
$options = array("projection" => array("fieldname" => 1));
$query = new MongoDB\Driver\Query($filter, $options);
$cursor = $manager->executeQuery("dbname.collectionname", $query);
foreach($cursor as $document) {
var_dump($document);
}
Я попробовал около 20 различных вариантов, но не могу найти ответ. Запросы без регулярных выражений работают нормально.
Я глупый. Это:
'fieldname' => array('$regex' => 'm')
найдет все документы с «м» где-то в поле «имя поля».
Я боролся с той же проблемой после перехода от устаревшего монго-драйвера к новому монгод-драйверу. Принятый ответ пока хороший. Но эта дополнительная информация также может быть полезна:
старый водитель (увидеть php.net) требует полного регулярного выражения, включая косые черты, например:
$query1 = [ 'field' => new MongoRegex("/d+/i") ];
новый водитель Нужно удалить косые черты. Также есть два способа отправки регулярных выражений, см. MongoDB-водитель-доска:
$query1 = [ 'field' => [ '$regex': => '\d+' ]];
$query2 = [ 'field' => new MongoDB\BSON\Regex('\d+'), 'i'];
Обратите внимание, что в качестве второго параметра используются общие reg-ex-flags. Конечно, вы можете оставить их. Как я сделал в первой строке. Кстати, в конце концов, похоже, что оба способа переводятся одинаково:
{"field":{"$regex":"\d+","$options":"i"}}
Если вы хотите сохранить его динамическим, потому что вы не знаете, является ли это строка поиска или регулярное выражение, вот пример кода:
if(@preg_match($value, null) !== false){
$value = new MongoDB\BSON\Regex(trim($value, '/'), 'i');
// alternatively you may use this:
// $value = array('$regex' => trim($value, '/'));
// with options, it looks like this:
// $value = array('$regex' => trim($value, '/'), '$options' => );''
}
$search = array($field => $value);
$options = [
"skip" => 0,
"limit" => 10,
"projection" => NULL
];
$query = new MongoDB\Driver\Query($search, $options);
$cursor = $this->mongo->executeQuery($database.'.'.$collection, $query);
}