我正在将网站的某些部分从mysql移动到mongodb,而将使用mongodb的一部分是搜索。我有一个问题,如果我在mysql中进行此查询
SELECT * FROM table WHERE a1 LIKE '%test%' OR a2 LIKE '%test%'
我将获得超过10k的结果。没关系。
如果我在mongo中执行此查询
$mongo->find(
array(
'$or' => array(
array('a1' => new MongoRegex('/test/')),
array('a2' => new MongoRegex('/test/'))
)
)
)->count();
我将获得2k左右的结果,减少5倍。这是怎么回事?
每个数据库中的数据都是相同的。
答案 0 :(得分:6)
MySQL默认为LIKE is case-insensitive:
以下两个语句说明字符串比较不区分大小写,除非其中一个操作数是二进制字符串:
mysql> SELECT 'abc' LIKE 'ABC'; -> 1
但默认情况下,MongoDB的正则表达式搜索将区分大小写,因为JavaScript的正则表达式区分大小写。
尝试使用不区分大小写的正则表达式。我不熟悉MongoRegex的语法,但the fine manual说通常的/i
修饰符应该有效:
new MongoRegex('/test/i')
案例问题与MySQL(~10k)中的匹配比MongoDB(~2k)更多。