Regex 使用排序规则和正则表达式比较mongodb中的全宽和半宽日语字符

Regex 使用排序规则和正则表达式比较mongodb中的全宽和半宽日语字符,regex,mongodb,encoding,collation,Regex,Mongodb,Encoding,Collation,根据和,应该可以利用排序忽略日文文本中的全宽和半宽差异 我尝试了以下方法 { locale: "ja", caseLevel:true, strength:1} 有不同的力量,但没有一个在工作 db.getCollection('mycollection') .find({"desc":/バンド/}) .collation({ locale: "ja", caseLevel:true, strength:1}) 此查询无法从以下文档获取结果 {

根据和,应该可以利用
排序
忽略日文文本中的全宽和半宽差异

我尝试了以下方法

{ locale: "ja", caseLevel:true, strength:1} 
有不同的力量,但没有一个在工作

db.getCollection('mycollection')
        .find({"desc":/バンド/})
        .collation({ locale: "ja", caseLevel:true, strength:1})
此查询无法从以下文档获取结果

{
    "desc": "*EGRパイプバンド外れ"
}

更新

找到了MongoDB正则表达式中无法应用排序规则的原因,因此,如果我使用某些匹配来执行查询,则结果是完美的:

db.getCollection('mycollection')
        .find({"desc":"*EGRパイプバンド外れ???"})
        .collation({ locale: "ja", caseLevel:true, strength:1})
此查询将返回
*EGRパイプバンド外れ此结果


但是如果我使用regex,没有任何建议吗?

没有办法让
collate
与任何regex
find
逻辑一起工作,因为regex脚本将覆盖任何
collate
定义,并且只使用其自身定义的逻辑,即查找任何包含半宽
的字符串バンド仅限

实现这一点的最简单方法是在将搜索文本发送到MongoDB客户端之前添加额外的逻辑,并将文本复制到半幅和全幅。您可以使用一些现有的工具,如

然后使用
$或
,将半宽和全宽搜索参数应用到
查找
条件中

db.mycollection.find({$or: [{"desc":/バンド/}, {"desc":/バンド/}]}) 
同一问题


是的,我已经考虑过了,这是我最后的选择,因为它无法处理混合情况,例如
バンド。我在ICU中看过一些关于
标准化的章节,在ICU的演示中,似乎可以使用标准化来标准化字符。但我无法将其用于排序,是否可以使用?@Jarvan是的,我考虑过这个混合案例,但这是一个可怕的例子,谁会发送这样一个混合文本?我从来没见过。但不幸的是,目前还没有一个纯粹的mongo解决方案。在mongo呼叫之前你需要一些东西。。。我不认为有任何方法可以对字符进行修改,使其同时匹配半宽和全宽字符,特别是在正则表达式中。@Jarvan如果您想利用我的解决方案并涵盖混合大小写,您可以生成一个字符串数组,基本上是半宽和全宽字符的组合(如
バンド
バンド
バンド,等等)和
$或
都是,但我想这在mongo会很慢。@Jarvan抱歉,我希望我能给出一个完整的答案,但这真的是一个奇怪的边缘案例:(请检查我的其他答案,有一些关于日语文本的有趣答案:)