5

-->请查看底部的更新,我在 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()
4

1 回答 1

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

于 2012-05-15T01:14:29.143 回答