- > 请查看底部的更新,我在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
- 更新 -
所以我在壳牌中尝试过,令我惊讶的是它在那里也不起作用。
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()
答案 0 :(得分:2)
每个查询都有4个允许的正则表达式标准的硬限制。大约六个月前,它已在核心mongo代码中修复:https://github.com/mongodb/mongo/commit/62554d064a264f9b6c28099ba71421f250bbbba9
看起来这个修补程序还没有进入mongo的1.8或2.0分支,这里是显示硬限制的v1.8分支:https://github.com/mongodb/mongo/blob/v1.8/db/matcher.cpp#L159