【问题标题】:How to search for accented characters in mongodb collection using nodejs如何使用nodejs在mongodb集合中搜索重音字符
【发布时间】:2015-01-13 06:41:08
【问题描述】:

MongoDB 将 É 和 E 视为两个独立的东西,所以当我搜索 E 时,它不会找到 É。

有没有办法让 MongoDB 将它们视为同一事物?

我在跑步

var find =Users.find();
var re = new RegExp(name, 'i');
find.where('info.name').equals(re);

如何匹配包含重音字符的字符串并得到结果?

【问题讨论】:

    标签: javascript node.js mongodb


    【解决方案1】:

    mongodb 不支持此功能,我怀疑它是否会在不久的将来。您可以采取的措施是在每个文档中存储一个不同的字段,其中包含每个名称的简单形式,以小写

    {
      info:{"name":"Éva","search":"eva"};
    }
    
    {
      info:{"name":"Eva","Search":"eva"}
    }
    

    当你有这样的文档结构时,你有一些优势,

    您可以在字段 search 上创建索引,

    db.user.ensureIndex({"Search":1})
    

    并触发一个简单的查询,以找到匹配项。当您搜索特定术语时,将该术语转换为其简单形式,然后转换为小写,然后进行查找。

    User.find({"Search":"eva"}); 
    

    这也将使用索引,regex 查询不会。

    另请参阅:Mongodb match accented characters as underlying character

    但是,如果您想以艰难的方式来做,建议这样做。只是为了记录,我在这里发布,

    您需要在简单字母与其可能的重音形式之间建立映射关系。例如:

    var map = {"A":"[AÀÁÂÃÄÅ]"};
    

    假设搜索词是a,但数据库文档有其重音形式,那么,您需要自己构建一个动态正则表达式,然后再将其传递给find(),查询。

    var searchTerm = "a".toUpperCase();
    var term = [];
    for(var i=0;i<searchTerm.length;i++){
        var char = searchTerm.charAt(i);
        var reg = map[char];
        term.push(reg);
    }
    
    var regexp = new RegExp(term.join(""));
    
    User.find({"info.name":{$regex:regexp}})
    

    请注意,所描述的示例也可以处理 length &gt; 1 的搜索词。

    【讨论】:

    • 感谢您的回复。您能建议如何使用正则表达式进行快速修复吗?
    • @dreamhigh,我已经更新了我的答案。但这不是您处理这种情况所需的方式。您需要重组和重新索引您的文档以获得更好的性能。您应该遵循第一种方法。
    猜你喜欢
    • 2016-09-04
    • 2015-06-04
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 2010-11-25
    相关资源
    最近更新 更多