查阅全网和官方文档几乎都是这种形式:
db.user.find(name:/汉字/);
db.user.find(name:/^汉字/);
db.user.find(name:/汉字/i);
亲测在PHP中都不管用
实际在PHP中不应该带着前后的反斜杠,主要起作用的是$options
中的参数,设置为imx
即可实现模糊查询的效果
关于$options
的选项说明
- i 忽略大小写
- m 多行匹配模式
- x 忽略非转义的空白字符
- s 单行匹配模式
- i,m,x,s可以组合使用
PHP中有效写法:
$query['name'] = ['$regex' => "$name",'$options'=>'imx'];
PHP中无效写法汇总:
$query['name'] = ['$regex' => "/$name/",'$options'=>'imx'];
$query['name'] = ['$regex' => "/^$name/"];
$query['name'] = ['$regex' => "/$name/i"];
一个完整查询示例:
$query['name'] = ['$regex' => "$name",'$options'=>'imx'];
$query['is_show'] = ['$eq' => 1];
$options = [
//geo聚合查询
[
'$geoNear' => [
'near' => ['type' => 'Point', 'coordinates' => [(double)$lng, (double)$lat]],
'distanceField' => 'distance',
'spherical' => true,
'distanceMultiplier' => 0.001,
'query' => $query
],
],
//分页,页码处理
[
'$skip' => (int)$page,
],
//限制返回数据条数
[
'$limit' => (int)$pageSize
],
];
return $this->mongo->aggregate($options)->toArray();