Установите фильтр с помощью регулярного выражения в запросе с помощью PHP-класса MongoDB \ Driver \ Query

Использование 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 различных вариантов, но не могу найти ответ. Запросы без регулярных выражений работают нормально.

3

Решение

Я глупый. Это:

'fieldname' => array('$regex' => 'm')

найдет все документы с «м» где-то в поле «имя поля».

5

Другие решения

Я боролся с той же проблемой после перехода от устаревшего монго-драйвера к новому монгод-драйверу. Принятый ответ пока хороший. Но эта дополнительная информация также может быть полезна:

старый водитель (увидеть 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);
}
2

По вопросам рекламы [email protected]