在mongodb $ regex中使用排序规则

时间:2017-01-03 10:13:19

标签: mongodb mongodb-query

由于v3.4排序规则可用于查找操作,尤其是与变音字符匹配时。虽然具有确定值的查找查询($ eq opeartor或相应的构造)将匹配字母和对应的变音符号,但如果使用$ regex以便在部分搜索字符串上实现匹配,则情况不一样(&#39 ; LIKE'。)

有没有让$ regex查询使用与$ eq查询相同的排序方法?

考虑示例集合testcoll:

{ "_id" : ObjectId("586b7a0163aff45945462bea"), "city" : "Antwerpen" }, 
{ "_id" : ObjectId("586b7a0663aff45945462beb"), "city" : "Antwërpen" }

此查询将找到两个记录

db.testcoll.find({city: 'antwerpen'}).collation({"locale" : "en_US", "strength" : 1});

使用正则表达式的相同查询不会(仅使用' Antwerpen'查找记录)

db.testcoll.find({city: /antwe/i}).collation({"locale" : "en_US", "strength" : 1});

2 个答案:

答案 0 :(得分:1)

Documentation

不区分大小写的正则表达式查询通常不能有效地使用索引。 $ regex实现不支持排序规则,并且无法利用不区分大小写的索引。

答案 1 :(得分:0)

无需在正则表达式上使用排序规则。您可以使用正确的正则表达式从功能上实现此行为。

考虑到Antwerpen示例,以下正则表达式为您提供了数据库中的所有匹配项:

/antw[eë]repen/i

要生成上述正则表达式,您必须先使用以下替换公式对搜索字符串进行正则表达式替换:

str.replace(/e/ig, '[eë]')

当然,您必须使用所有折射特征。您也可以简单地使用以下库:diacritic-regex