Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex MongoDB对带括号文本的不区分大小写查询_Regex_Mongodb_Mongodb Query - Fatal编程技术网

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

Regex MongoDB对带括号文本的不区分大小写查询,regex,mongodb,mongodb-query,Regex,Mongodb,Mongodb Query,我对mongodb上不区分大小写的查询有一个非常恼人的问题 我在web应用程序中使用MongoTemplate,需要对集合执行不区分大小写的查询 使用此代码 Query q = new Query(); q.addCriteria(Criteria.where("myField") .regex(Pattern.compile(fieldValue, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE))); return mongoTemplate

我对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"}}
当我有简单的文本时,这非常有效,例如:

头状花序

但是…但是…当有括号()时,查询不起作用。 它根本不起作用,甚至查询文本也是按照文档中的方式编写的……示例:

问题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 (....)
那么…我做错什么了?我忘记了一些模式。一些要包含在模式中。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"}}
有效。

如果使用带有“字符串”的运算符作为输入,则必须为保留字符(如
()
)引用文本

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

{ "myField" : { 
    "$regex" : "Ceratonereis \\(Composetia\\) costae" , 
    "$options" : "iu"
}}
使用$strcasecmp。 MongoDB 2.2中引入了聚合框架。您可以使用字符串运算符“$strcasecmp”在字符串之间进行不区分大小写的比较。
这是一个老问题,但你可以使用
query.replace(/[-[\]{}()*+?,\\/^$\s]/g,\\$&)

这是使用
聚合
匹配项

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

为什么在选项中使用
u
(“$options”:“iu”)?很好,回答……它给了我解决问题的输入:“Query q=new Query();q、 addCriteria(Criteria.where(“myField”).regex(Pattern.compile(Pattern.quote(myFieldValue),Pattern.CASE不区分大小写| Pattern.UNICODE_CASE));'这给了我输出查询:“{”scientificName:“{”$regex:“\\Qhaliclona(rhizoniera)sarai\\E”,“$options:“iu”}}”,这是有效的。@dgiaig它应该指出的,因为使用字符串编译就是这样工作的。这里的方法是多余的,因为正如我所说,只保留像
()
这样的字符。这是一个regex的核心问题。别忘了回答。@dgiag没关系,欢迎你。欢迎来到堆栈溢出。这主要是吃力不讨好的表现,目前你的问题有四票赞成和两票观察者,但这里只有一票赞成和你自己的接受(谢谢)。所以,只是预览一下要习惯什么。当我的字符串动态出现时,我该怎么做