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

标签 javascript node.js mongodb

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

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

我在运行

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

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

最佳答案

此功能在 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 的搜索词。

关于javascript - 如何使用nodejs在mongodb集合中搜索重音字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27916272/

相关文章:

javascript - Mongoose "delete"怎么能有不存在的文件?

node.js - 通过多模块方法访问 mongodb/mongoskin 的效率?

mongodb - 如何在 docker-compose 上为 mongodb 初始化一个新的用户和数据库

javascript - 从 onChange 事件填充 FilteringSelect 数据存储

c# - 动态添加元素到 jQuery Sortable

node.js - 使用带 Passport 和 Sequelize 的谷歌社交登录时查询执行多次

node.js - 使用 Watson Developer Cloud Node SDK 在 IBM Watson Discovery Service 中创建新文档

javascript - 通过 CSS 隐藏括号内的文本?

javascript - Ajax 调用后面的代码。达到完成阶段,但不返回成功或触发代码隐藏功能

node.js - 无法在 ubuntu 上安装 npm bcrypt