由于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});
答案 0 :(得分:1)
不区分大小写的正则表达式查询通常不能有效地使用索引。 $ regex实现不支持排序规则,并且无法利用不区分大小写的索引。
答案 1 :(得分:0)
无需在正则表达式上使用排序规则。您可以使用正确的正则表达式从功能上实现此行为。
考虑到Antwerpen
示例,以下正则表达式为您提供了数据库中的所有匹配项:
/antw[eë]repen/i
要生成上述正则表达式,您必须先使用以下替换公式对搜索字符串进行正则表达式替换:
str.replace(/e/ig, '[eë]')
当然,您必须使用所有折射特征。您也可以简单地使用以下库:diacritic-regex。