【问题标题】:Use of collation in mongodb $regex在 mongodb $regex 中使用排序规则
【发布时间】:2017-05-17 09:37:50
【问题描述】:

由于 v3.4 排序规则可用于查找操作,尤其是涉及到变音符号字符的匹配时。虽然具有确定值($eq 运算符或相应构造)的查找查询将匹配字母和对应的变音符号,但如果使用 $regex 以实现部分搜索字符串('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});

【问题讨论】:

标签: mongodb mongodb-query


【解决方案1】:

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

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

/antw[eë]rpen/i

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

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

当然,你必须用所有的变音符号来做。您也可以简单地使用以下库:diacritic-regex

【讨论】:

    【解决方案2】:

    Documentation

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

    【讨论】:

    • 感谢您指出这一点。因此,问题尚未解决:(
    猜你喜欢
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 2010-12-04
    • 2020-09-22
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多