-->请查看底部的更新,我在 Mongo shell 中复制了相同的问题
我的标准通过 GET 参数传递并被放入 $data (作为 assc 数组)。然后它进入下面的部分,其中每个搜索词变得部分不完全匹配。之后,我们删除(未设置)空标准。
总共有 15 个可能的字段,至少可以设置 1 个,最多可以设置 15 个。
foreach ($data as $k => $v) {
// Make them partial match
$data[$k] = new MongoRegex('/'.$v.'/i');
// Remove empty criteria
if (empty($v)) unset($data[$k]);
}
// Run the search
$cursor = $this->collection->find($data);
只要通过的标准是 4 或更少,一切都很好,例如:
Array (
[phone] => MongoRegex Object ( [regex] => 433 [flags] => i )
[property_name] => MongoRegex Object ( [regex] => west [flags] => i )
[city] => MongoRegex Object ( [regex] => H [flags] => i )
[zip_postcode] => MongoRegex Object ( [regex] => 9 [flags] => i )
)
这将返回 5 个结果。
但是在第 4 个之后添加的任何标准都是无效的。
Array (
[phone] => MongoRegex Object ( [regex] => 433 [flags] => i )
[state_province] => MongoRegex Object ( [regex] => Virginia [flags] => i )
[property_name] => MongoRegex Object ( [regex] => west [flags] => i )
[city] => MongoRegex Object ( [regex] => H [flags] => i )
[zip_postcode] => MongoRegex Object ( [regex] => 9 [flags] => i )
)
这应该返回 2 但仍返回 5 并且无论添加多少条件项都将返回 5
--更新--
所以我在 Shell 中尝试过它,令我惊讶的是它在那里也不起作用。
db.property_list.find({phone:/433/, property_name:/west/, city:/h/, zip_postcode:/9/}).count()
返回 5
现在,当我添加第 5 个参数时,它应该将结果缩小到 2,但它无效并且仍然显示计数为 5!!!
db.property_list.find({phone:/433/, property_name:/west/, city:/h/, zip_postcode:/9/, state_province:/Virginia/}).count()
返回 5
通过大量的实验,我意识到它只是被拾取的前 4 个标准!!就像在最后一个示例中,我将位置切换为“城市”标准'state_province'
,'city'
这将是无效的,因为它将是第 5 个标准!
--新更新--
事实证明,如果我在第 5 个标准上使用普通匹配而不是正则表达式,它将起作用。我是否正确假设 Mongo 只能为 4 个正则表达式标准执行 find() ?所以这将正确返回 1
db.property_list.find({phone:/433/, property_name:/west/, city:/h/, zip_postcode:/9/, state_province:Virginia}).count()