【问题标题】:Spring MongoTemplate, issue with Criteria and RegexSpring MongoTemplate,标准和正则表达式问题
【发布时间】:2021-03-18 21:25:23
【问题描述】:

我在尝试查询包含数组的 mongo 集合(称为项目)时遇到问题。我有一个查询方法,它将检查传递给方法的 ListArray 是否与 mongo 数组中的任何条目匹配。现在这一直有效,直到数据库中的区分大小写不匹配。

我不知道文档中的值是大写还是小写,所以我想添加一个正则表达式来忽略大小写。但是我不知道该怎么做。

这是我的查询方法的代码:

 @Override
    public List<Project> findAllProjectsForShowCaseNewestFirst(Integer offset, Integer limit, List<String> techStack) {
        Query query = new Query();
        query.with(Sort.by(Sort.Direction.DESC, "createdDate"));
        if(!techStack.isEmpty()) {
            query.addCriteria(Criteria.where("projectTechStack").in(techStack));
        }
        return mongoTemplate.find(query, Project.class);
    }

我尝试了以下方法,但它会引发错误:

query.addCriteria(Criteria.where("projectTechStack").in(techStack).regex("i"));

如果有人可以在这里帮助我,我将非常感激。

谢谢

编辑:值得注意的是,我可以看到这对于一个简单的字符串是如何工作的,如 here 所见,但我一生都无法看到这将如何应用于列表

【问题讨论】:

  • 这能回答你的问题吗? Spring Data mongo case insensitive like query
  • 感谢@Felipe 的回复,问题是,我不知道如何将该逻辑应用于字符串列表,即 $n。在我的代码示例中:query.addCriteria(Criteria.where("projectTechStack").in(techStack).regex("i")); techStack 是一个列表数组
  • 如果要将正则表达式应用于文档中的列表,请使用带有 $filter 运算符的聚合查询。此数组运算符将允许您迭代列表,并且您可以为每个数组元素应用正则表达式条件。我认为这会奏效。

标签: spring mongodb spring-boot spring-data-mongodb


【解决方案1】:

有一种替代方法可以满足您的要求,您必须将IN 条件转换为MongoDB 上下文中的多个OR 条件,如下所示:

MongoDB 查询

db.getCollection('project').find({
  "$or":[
    {
      "projectTechStack":{
        $regex:".*AVA.*",
        $options:"i"
      }
    },
    {
      "projectTechStack":{
        $regex:".*SCRIPT.*",
        $options:"i"
      }
    },
    {
      "projectTechStack":{
        $regex:".*LANG.*",
        $options:"i"
      }
    }
  ]
})

我们可以将上面的查询在java中转换如下

    @Override
    public List<Project> findAllProjectsForShowCaseNewestFirst(Integer offset, Integer limit, 
                                                       List<String> techStack) {
        Query query = new Query();
        query.with(Sort.by(Sort.Direction.DESC, "createdDate"));
        Criteria outerCriteria = new Criteria();
        if(!techStack.isEmpty()) {
           // We are adding each regex as criteria to list which will be used in 
           // main query with OR operator
            List<Criteria> regexCriteria = new ArrayList<>();
            for (String techStackTemp : techStack) {
                regexCriteria.add(Criteria.where("projectTechStack").regex(techStackTemp, "i"));
            }
            outerCriteria.orOperator(regexCriteria.toArray(new Criteria[0]));
            query.addCriteria(outerCriteria);
        }
        return mongoTemplate.find(query, Project.class);
    }

注意:选项"i"表示不区分大小写的正则表达式搜索

【讨论】:

    【解决方案2】:

    试试这个query.addCriteria(Criteria.where("projectTechStack").regex(".*"+techStack+".*","i"));

    【讨论】:

    • 问题是使用正则表达式模式列表查询结果,但使用您的答案我们只能使用单个正则表达式模式进行查询
    猜你喜欢
    • 2020-12-21
    • 1970-01-01
    • 2011-01-04
    • 2016-12-11
    • 2011-12-31
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 2011-01-25
    相关资源
    最近更新 更多