- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我想搜索部分名字和姓氏匹配 - 例如在 sql 中
f_name LIKE J% OR l_name LIKE S%
将匹配 John Smith 或 John Henry 或 Harry Smith 。
我假设我可能需要使用“$or”运算符,
到目前为止,我有这个,我相信它正在正确地执行 LIKE % 部分,但我相信它正在执行“AND”搜索(意味着它搜索 f_name LIKE J% AND l_name LIKE S% 所以它只会匹配 John史密斯):
$name1="J";
$name2="S";
$cursor = $this->clientCollection->find(array('f_name' => new MongoRegex('/^'.$name1.'/i'), 'l_name' => new MongoRegex('/^'.$name2.'/i') ));
注意:这将匹配包含在 %J% 中的内容
MongoRegex('/'.$name1.'/i')
这将匹配以(注意添加的 ^)开头,如 J%
MongoRegex('/^'.$name1.'/i')
最佳答案
$or
接受一个子句数组,因此您基本上只需要在当前查询周围包装另一个数组:
array('$or' => array(
array('f_name' => new MongoRegex('/'.$name1.'/i')),
array('l_name' => new MongoRegex('/'.$name2.'/i'))
));
编辑:前面的示例错过了一组内部 array()
调用。
我发布的原始错误示例如下所示:
array('$or' => array(
'f_name' => new MongoRegex('/'.$name1.'/i'),
'l_name' => new MongoRegex('/'.$name2.'/i')
));
这是一个有效的查询,但不是一个有用的查询。本质上, f_name
和 l_name
查询部分仍然是 ANDed 在一起,所以 $or
部分是无用的(它只通过一个查询,所以这与单独运行该查询相同)。
至于您在评论中提到的替代方案,该替代方案不起作用,因为查询中的最外层数组必须是关联数组。之所以会出现这种困惑,是因为 Mongo 的查询语法类似于 JSON,并且混合使用了对象和数组,但是这两种结构在 PHP 中都由数组表示。 PHP Mongo 驱动程序基本上将 PHP 关联数组转换为 JSON 对象({ ... }
),并将“普通” PHP 数组转换为 JSON 数组([ ... ]
) .
实际结果是,“普通”PHP 数组通常仅在关联数组中有效,例如在为一个字段指定多个值时。以下示例来自 PHP Mongo manual显示查询中“正常”数组的有效用法:
$cursor = $collection->find(array("awards" => array('$in' => array("gold", "copper"))));
关于php - 如何进行 OR 搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5999428/
我是一名优秀的程序员,十分优秀!