前言
在实际开发中, 有不少的场景需要使用到模糊查询, MongoDB shell 模糊查询很简单:
1
|
db.collection.find({ '_id' : /^5101/})
|
上面这句就是查询_id以'5101'开始的内容。
在老的MogoDB中模糊查询挺简单的,这里简单记录下模糊查询的操作方式:
命令行下:
1
|
db.letv_logs.find({ "ctime" :/uname?/i});
|
php操作
1
2
|
$query = array ( "name" => new MongoRegex( "/.*”.$name." .*/i"));
$db ->find( $query );
|
下面主要就讲下新PHP驱动中怎么查询:
1
2
|
$query = new \MongoDB\Driver\Query( '_id' => [ '$regex' => '^5101' ]);
$this ->getManager()->executeQuery( $this ->dbname . $this ->collection, $query );
|
上面就是新驱动中执行模糊查询, 说实话, 挺吐槽这个新驱动, 相比老的驱动, 这个函数名也太长了吧。。。都快超过swift的函数名了。而且老驱动上的不少功能都在新驱动上干掉了。虽然提供了一个mongodb php library
的类库来操作, 但是这个库里面有60多个文件,有时候比我项目文件还要多,这是闹哪样。这我建议自己去封装一个Driver类来使用。
上面吐槽吐的有点跑题了, 除了直接模糊查询, 在和$in
或$nin
使用的时候, 需要特别注意下:
1
|
$filter = [ '_id' => [ '$in' => [ '$regex' => '^5101' ]]];
|
如果你像上面那么写filter的话, 执行的时候将抛出一个致命错误:
1
|
PHP Fatal error: Uncaught MongoDB\Driver\Exception\ConnectionException: $in needs an array in filename
|
这里说$in
里面需要提供一个数组, 那么我们把上面的$filter
改下, 给它弄个数组过去:
1
|
$filter = [ '_id' => [ '$in' => [[ '$regex' => '^5101' ]]];
|
但是不幸的是, 还是无法成功的得到想要的结果:
1
|
PHP Fatal error: Uncaught MongoDB\Driver\Exception\ConnectionException: cannot nest $ under $in in filename
|
这里说$in
中不能出现$, 那咋办呢? 其实在$in
或$nin
中要使用模糊匹配, 需要使用\MongoDB\BSON\Regex
类的实例:
1
|
$filter = [ '_id' => [ '$in' => [ new \MongoDB\BSON\Regex( '^5101' , 'i' )]]];
|
这次终于得到我们想要的结果了。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:http://ghost.icosplay.cc/2017/04/25/mongodb-zai-php7zhong-shi-xian-mo-hu-cha-xun/