如何使用nodejs在mongodb集合中搜索重音字符

时间:2015-01-13 06:41:08

标签: javascript node.js mongodb

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

有没有办法让MongoDB将它们视为同一个东西?

我正在运行

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

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

1 个答案:

答案 0 :(得分:2)

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 > 1的搜索字词。

相关问题