Chr*_*ozo 5 querying case-insensitive mongoose mongodb mongodb-query
我想在我的mongodb数据库中搜索一个集合.在我的收藏中,我有"name"字段的文档可以是以下值:
[i]"PalácioGuanabara","PaláciodaCidade","FestaPalácio"等.
当用户键入"pala"或"palá"或"Pala"或"PalÁ"之类的搜索时,[i]中的所有这些都必须构建结果集.
我发现在MongoDB中我可以在搜索中使用正则表达式,例如:
{ "name": { $regex: new Regex(".*pala.*", "i") } }
Run Code Online (Sandbox Code Playgroud)
好的,这种方法不区分大小写,并使用SQL中的百分比逻辑("%pala%").但是,它不会忽略数据库中寄存器的重音.
我找到了另一个使用$ text索引的替代方法:https://docs.mongodb.org/manual/core/index-text/
这种方法可以忽略区分大小写和重音.但"搜索"不接受正则表达式,因此我无法搜索"%pala%"之类的内容.
总结一下,我想在MongoDB中进行以下SQL查询:
select * from collection where remove_accents(upper(name)) like '%Pala%'
Run Code Online (Sandbox Code Playgroud)
此查询返回的结果名称为"palácio","palacio","PaláCiô"等.
这对我有用!
只需用包含重音元音的正则表达式替换元音即可。另外可以$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' } });
Run Code Online (Sandbox Code Playgroud)
如果你只是使用会发生什么:
find({name: {$regex: 'pala', $options: "i"}})
Run Code Online (Sandbox Code Playgroud)
你使用的new Regex()那个可能无效的构造函数有效的构造函数是new RegExp()
MongoDb 内部没有灵丹妙药。\n但是既然你显然改变了用户输入来创建\'%pala%\',为什么不将“a”替换为“[a\xc3\xa1]”并用“.*”换行,这样你就可以使用正则表达式和有你的变音符号。
\n\n以下选项无需太多工作即可创建替换。
\n\n法语字母\n[a-zA-Z\xc3\xa0\xc3\xa2\xc3\xa4\xc3\xb4\xc3\xa9\xc3\xa8\xc3\xab\xc3\xaa\xc3\xaf\xc3\xae \xc3\xa7\xc3\xb9\xc3\xbb\xc3\xbc\xc3\xbf\xc3\xa6\xc5\x93\xc3\x80\xc3\x82\xc3\x84\xc3\x94\xc3\x89\xc3 \x88\xc3\x8b\xc3\x8a\xc3\x8f\xc3\x8e\xc5\xb8\xc3\x87\xc3\x99\xc3\x9b\xc3\x9c\xc3\x86\xc5\x92]
\n\n德语字母\n有争议的大写字母 \xc3\x9f 现已包含在 unicode 中,但许多字体中都缺少该字母,因此它可能在屏幕上显示为问号。\n[a-zA-Z\xc3\xa4\xc3 \xb6\xc3\xbc\xc3\x9f\xc3\x84\xc3\x96\xc3\x9c\xe1\xba\x9e]
\n\n波兰语字母\n[a-pr-uwy-zA-PR-UWY-Z\xc4\x85\xc4\x87\xc4\x99\xc5\x82\xc5\x84\xc3\xb3\xc5\x9b\xc5\xba \xc5\xbc\xc4\x84\xc4\x86\xc4\x98\xc5\x81\xc5\x83\xc3\x93\xc5\x9a\xc5\xb9\xc5\xbb]\n注意没有Q、V和波兰语的X。但如果您也想允许所有英文字母,请使用 [a-zA-Z\xc4\x85\xc4\x87\xc4\x99\xc5\x82\xc5\x84\xc3\xb3\xc5\x9b\xc5\ xba\xc5\xbc\xc4\x84\xc4\x86\xc4\x98\xc5\x81\xc5\x83\xc3\x93\xc5\x9a\xc5\xb9\xc5\xbb]
\n\n意大利语字母\n[a-zA-Z\xc3\xa0\xc3\xa8\xc3\xa9\xc3\xac\xc3\xad\xc3\xae\xc3\xb2\xc3\xb3\xc3\xb9\xc3\xba \xc3\x80\xc3\x88\xc3\x89\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x92\xc3\x93\xc3\x99\xc3\x9a]
\n\n西班牙语字母\n[a-zA-Z\xc3\xa1\xc3\xa9\xc3\xad\xc3\xb1\xc3\xb3\xc3\xba\xc3\xbc\xc3\x81\xc3\x89\xc3\x8d \xc3\x91\xc3\x93\xc3\x9a\xc3\x9c]\n 来自 \n http://www.rexegg.com/regex-interesting-character-classes.html#languages
\n