如何使用 nodejs 在 mongodb 集合中搜索重音字符
How to search for accented characters in mongodb collection using nodejs
MongoDB 把 É 和 E 当作两个独立的东西,所以当我搜索 E 时,它不会找到 É。
有没有办法让 MongoDB 将它们视为同一事物?
我是运行
var find =Users.find();
var re = new RegExp(name, 'i');
find.where('info.name').equals(re);
如何匹配包含重音字符的字符串并获得结果?
mongodb
不支持此功能,我怀疑它是否会在不久的将来支持。您可以做的是在每个文档中存储一个不同的字段,其中包含每个名称的 simple 形式,在 lowercase.
中
{
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
的搜索词。
MongoDB 把 É 和 E 当作两个独立的东西,所以当我搜索 E 时,它不会找到 É。
有没有办法让 MongoDB 将它们视为同一事物?
我是运行
var find =Users.find();
var re = new RegExp(name, 'i');
find.where('info.name').equals(re);
如何匹配包含重音字符的字符串并获得结果?
mongodb
不支持此功能,我怀疑它是否会在不久的将来支持。您可以做的是在每个文档中存储一个不同的字段,其中包含每个名称的 simple 形式,在 lowercase.
{
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
的搜索词。