MongoDB: 如何查找忽略区分大小写、重音和百分比逻辑的文档 (%)
MongoDB: how to find documents ignoring case sensitive, accents and percent like logic (%)
我想在我的 mongodb 数据库中搜索 collection。在我的 collection 中,我有字段 "name" 的文档可以是这样的值:
[i] "Palácio Guanabara"、"Palácio da Cidade"、"Festa Palácio" 等
当用户键入 "pala" 或 "palá" 或 "Pala" 或 "PalÁ" 等搜索时,[i] 中的所有这些条目都必须构建结果集。
我发现在 MongoDB 中我可以在搜索中使用正则表达式,例如:
{ "name": { $regex: new Regex(".*pala.*", "i") } }
好的,这种方法不区分大小写,并使用来自 SQL ("%pala%") 的类似逻辑的百分比。但是,它不会忽略数据库中注册的重音。
我找到了另一个带有 $text 索引的替代方案:https://docs.mongodb.org/manual/core/index-text/
这种方法可以忽略区分大小写和重音符号。但是 "search" 不接受正则表达式,所以我不能搜索像“%pala%”这样的东西。
综上所述,我想在 MongoDB 中进行以下 SQL 查询:
select * from collection where remove_accents(upper(name)) like '%Pala%'
并且此查询返回名称为 "palácio"、"palacio"、"PaláCiô" 等的结果
MongoDb 里面没有灵丹妙药。
但是既然你显然改变了用户输入来创建“%pala%”,为什么不用“[aá]”替换 "a" 并用“.*”包装,这样你就可以使用正则表达式并使用你的变音符号。
这里是创建替换的选项。
法语字母
[a-zA-ZàâäôéèëêïîçùûüÿæœÀÂÄÔÉÈÈÊÏÇÙÛÜÆŒ]
德语字母
有争议的 ß 大写字母现在包含在 unicode 中,但在许多字体中都没有,因此它可能会在您的屏幕上显示为问号。
[a-zA-ZäöüßÄÖÜẞ]
波兰语字母
[a-pr-uwy-zA-PR-UWY-Z?
请注意,波兰语中没有 Q、V 和 X。但是,如果您还想允许所有英文字母,请使用 [a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ]
意大利语字母
[a-zA-ZàèéìíòóùúÀÈÉÌÍÈÒÓÙÚ]
西班牙字母
[a-zA-ZáéíñóúüÁÉÍÑÓÚÜ]
从
http://www.rexegg.com/regex-interesting-character-classes.html#languages
如果你只使用会发生什么:
find({name: {$regex: 'pala', $options: "i"}})
您使用的 new Regex()
可能不是有效的构造函数 有效的构造函数是 new RegExp()
这对我有用!
只需将元音替换为包含重音元音的正则表达式。另外可以使用 $options: 'i'
来避免区分大小写。
function diacriticSensitiveRegex(string = '') {
return string.replace(/a/g, '[a,á,à,ä,â]')
.replace(/e/g, '[e,é,ë,è]')
.replace(/i/g, '[i,í,ï,ì]')
.replace(/o/g, '[o,ó,ö,ò]')
.replace(/u/g, '[u,ü,ú,ù]');
}
find ({ name: { $regex: diacriticSensitiveRegex('pala'), $options: 'i' } });
我想在我的 mongodb 数据库中搜索 collection。在我的 collection 中,我有字段 "name" 的文档可以是这样的值:
[i] "Palácio Guanabara"、"Palácio da Cidade"、"Festa Palácio" 等
当用户键入 "pala" 或 "palá" 或 "Pala" 或 "PalÁ" 等搜索时,[i] 中的所有这些条目都必须构建结果集。
我发现在 MongoDB 中我可以在搜索中使用正则表达式,例如:
{ "name": { $regex: new Regex(".*pala.*", "i") } }
好的,这种方法不区分大小写,并使用来自 SQL ("%pala%") 的类似逻辑的百分比。但是,它不会忽略数据库中注册的重音。
我找到了另一个带有 $text 索引的替代方案:https://docs.mongodb.org/manual/core/index-text/
这种方法可以忽略区分大小写和重音符号。但是 "search" 不接受正则表达式,所以我不能搜索像“%pala%”这样的东西。
综上所述,我想在 MongoDB 中进行以下 SQL 查询:
select * from collection where remove_accents(upper(name)) like '%Pala%'
并且此查询返回名称为 "palácio"、"palacio"、"PaláCiô" 等的结果
MongoDb 里面没有灵丹妙药。 但是既然你显然改变了用户输入来创建“%pala%”,为什么不用“[aá]”替换 "a" 并用“.*”包装,这样你就可以使用正则表达式并使用你的变音符号。
这里是创建替换的选项。
法语字母 [a-zA-ZàâäôéèëêïîçùûüÿæœÀÂÄÔÉÈÈÊÏÇÙÛÜÆŒ]
德语字母 有争议的 ß 大写字母现在包含在 unicode 中,但在许多字体中都没有,因此它可能会在您的屏幕上显示为问号。 [a-zA-ZäöüßÄÖÜẞ]
波兰语字母 [a-pr-uwy-zA-PR-UWY-Z? 请注意,波兰语中没有 Q、V 和 X。但是,如果您还想允许所有英文字母,请使用 [a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ]
意大利语字母 [a-zA-ZàèéìíòóùúÀÈÉÌÍÈÒÓÙÚ]
西班牙字母 [a-zA-ZáéíñóúüÁÉÍÑÓÚÜ] 从 http://www.rexegg.com/regex-interesting-character-classes.html#languages
如果你只使用会发生什么:
find({name: {$regex: 'pala', $options: "i"}})
您使用的 new Regex()
可能不是有效的构造函数 有效的构造函数是 new RegExp()
这对我有用!
只需将元音替换为包含重音元音的正则表达式。另外可以使用 $options: 'i'
来避免区分大小写。
function diacriticSensitiveRegex(string = '') {
return string.replace(/a/g, '[a,á,à,ä,â]')
.replace(/e/g, '[e,é,ë,è]')
.replace(/i/g, '[i,í,ï,ì]')
.replace(/o/g, '[o,ó,ö,ò]')
.replace(/u/g, '[u,ü,ú,ù]');
}
find ({ name: { $regex: diacriticSensitiveRegex('pala'), $options: 'i' } });