【问题标题】:Spring Data mongo case insensitive like querySpring Data mongo 不区分大小写,如查询
【发布时间】:2017-06-04 10:08:15
【问题描述】:

我想使用spring-data mongo 的正则表达式查询使文本搜索不区分大小写。

例如在 Oracle 中:

select * from user where lower(username) like '%ab%'

如何使用spring-data mongo 进行此查询?

提前致谢

【问题讨论】:

    标签: full-text-search mongodb-query spring-data-mongodb


    【解决方案1】:

    在存储库模式中我尝试了这个并且工作了

    @Query("{ 'username' : ?0 }.collat​​ion( { locale: 'en', strength: 2 } )")

    用户 findByUserName(String name);

    【讨论】:

      【解决方案2】:
      String tagName = "apple";
      
      Query query = new Query();
      query.limit(10);
      query.addCriteria(Criteria.where("tagName").regex(tagName));
      
      mongoOperation.find(query, Tags.class);
      

      参考 - https://mkyong.com/mongodb/spring-data-mongodb-like-query-example/

      【讨论】:

        【解决方案3】:

        您可以尝试以下方法。假设你有一个User pojo 类。

        使用 MongoTemplate

        i 不区分大小写的选项:

        Criteria regex = Criteria.where("username").regex(".*ab.*", "i");      
        mongoOperations.find(new Query().addCriteria(regex), User.class);
        

        使用 MongoRepository(区分大小写)

        List<User> users = userRepository.findByUserNameRegex(".*ab.*");
        
        interface UserRepository extends MongoRepository<User, String> {
             List<User> findByUserNameRegex(String userName);
        }
        

        使用 MongoRepository 和 Query dsl(区分大小写)

        List<User> users = userRepository.findByQuery(".*ab.*");
        
        interface UserRepository extends MongoRepository<User, String> {
             @Query("{'username': {$regex: ?0 }})")
             List<User> findByQuery(String userName);
        }
        

        对于基于非正则表达式的查询,您现在可以使用不区分大小写的搜索/排序,将区域设置和强度设置为主要或次要的排序规则:

        Query query = new Query(filter);
        query.collation(Collation.of("en").
                          strength(Collation.ComparisonLevel.secondary()));
        mongoTemplate.find(query,clazz,collection);
        

        【讨论】:

          【解决方案4】:

          对于数字字段(整数或双精度)的类似查询

          db.players.find({
            $and: [{
                "type": {
                  $in: ["football"]
                }
              },
              {
                $where : "/^250.*/.test(this.salary)"
              }]
          })
          

          查看详细代码:Spring Boot mongodb like query on int/double using mongotemplate

          【讨论】:

            【解决方案5】:
            @Repository
            public interface CompetenceRepository extends MongoRepository<Competence, String> {
            
                @Query("{ 'titre' : { '$regex' : ?0 , $options: 'i'}}")
                List<Competence> findAllByTitreLikeMotcle(String motCle);
            }
            

            应该可以完美运行,它适用于我的项目。法语单词也可以

            【讨论】:

              【解决方案6】:

              我知道这是一个老问题。我刚刚在另一篇文章中找到了解决方案。 使用 $regex 和 $options 如下:

              @Query(value = "{'title': {$regex : ?0, $options: 'i'}}")
              Foo findByTitleRegex(String regexString);
              

              查看原始答案: https://stackoverflow.com/a/19068401

              【讨论】:

              • 如果您的正则表达式是“测试”,这将返回标题为:test1、test2 等的文档。
              【解决方案7】:

              是的,你可以,只要你设置正确,我会在你的存储库方法中添加这样的东西:

              {'用户名': {$regex: /ab/i }})

              @Query("{'用户名': {$regex: /?1/i }})")

              列出 findUsersByUserName(String userName);

              【讨论】:

                猜你喜欢
                • 2023-03-04
                • 2014-06-18
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-11-16
                相关资源
                最近更新 更多