带括号的MongoDB不区分大小写的查询

时间:2015-06-19 10:20:52

标签: 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.findOne(q,MyClass.class);

我创建了以下查询

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

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

caPITella CapitatA

但是......但......当有括号()时,查询无法正常工作。 它根本不起作用,即使查询文本是按照文档中所写的那样写的......例如:

查询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"}}

作品。

3 个答案:

答案 0 :(得分:2)

如果$regex运算符使用"字符串"作为输入,您必须引用保留字符的文字,例如()

通常情况下,这只是一个\,但由于它已经在字符串中,因此您需要执行两次\\

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

答案 1 :(得分:0)

使用$ strcasecmp。 聚合框架是在MongoDB 2.2中引入的。你可以使用字符串运算符" $ strcasecmp"在字符串之间进行不区分大小写的比较。 它比使用正则表达式更值得推荐和使用。

答案 2 :(得分:0)

这是一个古老的问题,但是您可以使用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
        }
    // ....