php Mongo发现只使用4个标准

Maz*_*zzi 5 php search mongodb

- > 请查看底部的更新,我在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);
Run Code Online (Sandbox Code Playgroud)

只要通过的标准是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 ) 
)
Run Code Online (Sandbox Code Playgroud)

这将返回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 )
)
Run Code Online (Sandbox Code Playgroud)

这应该返回2,但仍然返回5,无论添加多少条件,它都将返回5

- 更新 -

所以我在壳牌中尝试过,令我惊讶的是它在那里也没有用.

db.property_list.find({phone:/433/, property_name:/west/, city:/h/, zip_postcode:/9/}).count()
Run Code Online (Sandbox Code Playgroud)

返回5

现在,当我添加第5个参数时,它应该将结果缩小到2,但它是无效的,仍然显示为5!

db.property_list.find({phone:/433/, property_name:/west/, city:/h/, zip_postcode:/9/, state_province:/Virginia/}).count()
Run Code Online (Sandbox Code Playgroud)

返回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()
Run Code Online (Sandbox Code Playgroud)

Ste*_*veK 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/匹配器.cpp#L159