MongoDB 对带括号的文本进行不区分大小写的查询

MongoDB case insensitive query on text with parenthesis

我在 mongodb.

上的不区分大小写的查询中遇到了一个非常烦人的问题

我在 Web 应用程序中使用 MongoTemplate,我需要对集​​合执行不区分大小写的查询。

使用此代码

Query q = new Query();
q.addCriteria(Criteria.where("myField")
.regex(Pattern.compile(fieldValue, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE))); 
return mongoTemplate.findOne(q,MyClass.class);

我创建以下查询

{ "myField" : { "$regex" : "field value" , "$options" : "iu"}}

当我有简单的文本时效果很好,例如:

caPITella CapitatA

but...but...当有parenthesis () 查询不工作。 它根本不起作用,即使查询文本是按照文档中的写法写的...示例:

查询 1:

{"myField" : "Ceratonereis (Composetia) costae" } -> 1 result (ok)

查询 2:

{ "myField" : { 
    "$regex" : "Ceratonereis (Composetia) costae" , 
   "$options" : "iu"
}} -> no results (not ok)

查询 3:

{ "scientificName" : { 
    "$regex" : "ceratonereis (composetia) costae" ,
    "$options" : "iu"
}}  -> no results (....)

所以...我做错了什么?我忘了一些 Pattern.SOME 包含在 Pattern.compile() 中?有什么解决办法吗?

谢谢

------ 更新 ------

user3561036 的回答帮助我弄清楚了必须如何构建查询。

所以,我已经通过修改

中的查询构建解决了
q.addCriteria(Criteria.where("myField")
.regex(Pattern.compile(Pattern.quote(myFieldValue), Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE))); 

输出查询

{ "myField" : { "$regex" : "\Qhaliclona (rhizoniera) sarai\E" , "$options" : "iu"}}

有效。

如果使用带有 "string" 的 $regex 运算符作为输入,那么您必须引用保留字符的文字,例如 ().

通常这是一个 \,但由于它已经在一个字符串中,所以您需要执行两次 \:

{ "myField" : { 
    "$regex" : "Ceratonereis \(Composetia\) costae" , 
    "$options" : "iu"
}}

使用 $strcasecmp。 MongoDB 2.2 中引入了聚合框架。您可以使用字符串运算符“$strcasecmp”在字符串之间进行不区分大小写的比较。 比使用正则表达式更推荐也更容易。

这是一个老问题,但你可以使用 query.replace(/[-[\]{}()*+?.,\/^$|#\s]/g, "\$&");

这与 aggregatematches 一起工作:

 const order = user_input.replace(/[-[\]{}()*+?.,\/^$|#\s]/g, "\$&");
 const regex = new RegExp(order, 'i');
 const query = await this.databaseModel.aggregate([
        {
          $match: {
            name : regex
        }
    // ....