【问题标题】:how to query case insensitivity and contains with Spring MongoTemplate如何使用 Spring MongoTemplate 查询不区分大小写和包含
【发布时间】:2020-10-14 05:57:11
【问题描述】:

我在 MongoDB 中有这样的 JSON 文档

{
  "os" : "Windows 10"
}

{
  "os" : "WINDOWS 8"
}

{
  "os" : "UBunTu 18.04"
}

如何在不区分大小写的情况下查询 os 并包含使用 Spring MongoTemplate 以便我可以传递 ["windows", "ubuntu"] 并从数据库中获取所有三个文档

我尝试了类似的方法,但没有成功。

String osRegEx = String.join(" | ", new String[]{"windows", "ubuntu"});
query.addCriteria(Criteria.where("os").regex(osRegEx, "i"));

【问题讨论】:

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


    【解决方案1】:

    它以这种方式工作......

    String osRegEx = String.join("|", new String[]{"windows.*", "ubuntu.*"});
    query.addCriteria(Criteria.where("os").regex("("+osRegEx+")", "i"));
    

    【讨论】:

      【解决方案2】:

      我认为您正面临这个问题,因为您为正则表达式提供了字符串。您在 mongo 中有 Windows 10 等版本号,但您只有正则表达式字符串来匹配 windows/ubuntu 部分:

      String osRegEx = String.join(" | ", new String[]{"windows.*", "ubuntu.*"});
      query.addCriteria(Criteria.where("os").regex(osRegEx, "i"));
      

      【讨论】:

      • 它正在与一个 "os" : { "$regularExpression" : { "pattern" : "Ubuntu.*", "options" : "i"}}} 一起工作,但是当我同时通过 "os" : { "$regularExpression" : { "pattern" : "CentOS.* | Ubuntu.*", "options" : "i"}}} 时它没有返回任何结果
      • 抛出InvalidMongoDbApiUsageException。它不允许在$or 中有多个'os'
      • 是的,对不起,它不起作用,我认为正则表达式应该有一个分组,如:(windows.*|ubuntu.*)
      • 哇.. 当我使用(windows.*|ubuntu.*)时它起作用了
      • String osRegEx = String.join("|", new String[]{"windows.*", "ubuntu.*"}); query.addCriteria(Criteria.where("os").regex("("+osRegEx+")", "i"));
      【解决方案3】:

      这里有一个解决方案:

      String [] queryStrs = { "windows", "ubuntu" };
      String patternStr = Stream.of(queryStrs).collect(Collectors.joining("|", "(", ")"));
      Pattern pattern = Pattern.compile(patternStr, Pattern.CASE_INSENSITIVE);
      
      Criteria criteria = new Criteria().regex(pattern);
      Query query = Query.query(criteria);
      List<Foo> result = mongoTemplate.find(query, Foo.class);
      

      【讨论】:

      • 我不明白为什么有人对答案投反对票。该代码工作正常 - 它返回所需的结果。可以要求解释帖子中使用的 API/代码。
      猜你喜欢
      • 2023-03-07
      • 2020-08-20
      • 2017-06-04
      • 2021-12-18
      • 2012-02-18
      • 2011-10-20
      • 2023-01-31
      • 2014-04-29
      相关资源
      最近更新 更多