3

将 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 种不同的可能性,但找不到答案。没有正则表达式的查询可以正常工作。

4

2 回答 2

5

我很蠢。这:

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

将在“fieldname”字段的某处找到所有带有“m”的文档。

于 2016-01-10T18:10:45.603 回答
3

从弃用的 mongo-driver 迁移到新的 mongodb-driver 后,我遇到了同样的问题。到目前为止,公认的答案很好。但是这些附加信息也可能会有所帮助:

驱动程序(请参阅php.net)需要完整的正则表达式,包括斜线,如下所示:

$query1 = [ 'field' => new MongoRegex("/d+/i") ];

驱动程序需要删除斜线。另外,有两种方法可以提交正则表达式,参见mongodb-driver-board

$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);
}
于 2017-10-20T11:03:13.077 回答