MongoDB:如何查找忽略区分大小写,重音和逻辑百分比的文档(%)

时间:2016-04-15 12:31:33

标签: mongodb mongoose mongodb-query case-insensitive querying

我想在我的mongodb数据库中搜索一个集合。在我的收藏中,我有“name”字段的文档可以是如下值:

[i]“PalácioGuanabara”,“PaláciodaCidade”,“FestaPalácio”等。

当用户键入“pala”或“palá”或“Pala”或“PalÁ”之类的搜索时,[i]中的所有这些都必须构建结果集。

我发现在MongoDB中我可以在搜索中使用正则表达式,例如:

{ "name": { $regex: new Regex(".*pala.*", "i") } }

好的,这种方法不区分大小写,并使用SQL中的百分比逻辑(“%pala%”)。但是,它不会忽略数据库中寄存器的重音。

我找到了另一种带有$ text索引的替代方法:https://docs.mongodb.org/manual/core/index-text/

此方法可以忽略区分大小写和重音。但是“搜索”不接受正则表达式,因此我无法搜索“%pala%”之类的内容。

总结一下,我想在MongoDB中进行以下SQL查询:

select * from collection where remove_accents(upper(name)) like '%Pala%'

此查询返回的结果名称为“palácio”,“palacio”,“PaláCiô”等。

3 个答案:

答案 0 :(得分:8)

如果您只使用以下内容会发生什么:

find({name: {$regex: 'pala', $options: "i"}})

您使用new Regex()可能无效的构造函数有效构造函数为new RegExp()

答案 1 :(得分:2)

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

答案 2 :(得分:1)

这对我有用!

只需用包含重音元音的正则表达式替换元音。另外,可以使用$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' } });