Sco*_*ter 6 php find partial mongodb
我想搜索部分名字和姓氏匹配 - 例如在sql中
f_name LIKE J% OR l_name LIKE S%
Run Code Online (Sandbox Code Playgroud)
会与John Smith或John Henry或Harry Smith相匹配.
我假设我可能需要使用"$或"运算符,
到目前为止,我已经相信我正在做正确的LIKE%部分,但我相信它正在进行"AND"搜索(意味着它搜索f_name LIKE J%和l_name LIKE S%,因此它只匹配John Smith):
$name1="J";
$name2="S";
$cursor = $this->clientCollection->find(array('f_name' => new MongoRegex('/^'.$name1.'/i'), 'l_name' => new MongoRegex('/^'.$name2.'/i') ));
Run Code Online (Sandbox Code Playgroud)
注意:这将匹配%J%
MongoRegex('/'.$name1.'/i')
Run Code Online (Sandbox Code Playgroud)
这将匹配开头(注意添加的^),如J%
MongoRegex('/^'.$name1.'/i')
Run Code Online (Sandbox Code Playgroud)
$or接受一个子句数组,因此您基本上只需要在当前查询周围包装另一个数组:
array('$or' => array(
array('f_name' => new MongoRegex('/'.$name1.'/i')),
array('l_name' => new MongoRegex('/'.$name2.'/i'))
));
Run Code Online (Sandbox Code Playgroud)
编辑:前面的示例错过了一组内部array()调用。
我发布的原始错误示例如下所示:
array('$or' => array(
'f_name' => new MongoRegex('/'.$name1.'/i'),
'l_name' => new MongoRegex('/'.$name2.'/i')
));
Run Code Online (Sandbox Code Playgroud)
这是一个有效的查询,但不是一个有用的查询。本质上,f_name和l_name查询部分仍然是 AND 在一起的,因此该$or部分是无用的(它只传递一个查询,所以它与单独运行该查询相同)。
至于您在评论中提到的替代方案,该方案不起作用,因为查询中最外层的数组必须是关联数组。之所以会出现这种混乱,是因为 Mongo 的查询语法类似于 JSON,并且混合使用了对象和数组,但这两种结构在 PHP 中都由数组表示。PHP Mongo 驱动程序基本上将 PHP 关联数组转换为 JSON 对象 ( { ... }),并将“普通”PHP 数组转换为 JSON 数组 ( [ ... ])。
实际结果是,“普通”PHP 数组通常仅在关联数组内有效,例如为字段指定多个值时。PHP Mongo 手册中的以下示例显示了查询中“普通”数组的有效用法:
$cursor = $collection->find(array("awards" => array('$in' => array("gold", "copper"))));
Run Code Online (Sandbox Code Playgroud)