Spring Data Mongo不区分大小写的like查询

26

我想使用正则表达式查询,使文本搜索大小写不敏感,并使用 spring-data mongo

例如在 Oracle 中:

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

我该如何使用 spring-data mongo 实现这个查询呢?

提前感谢您的帮助。

7个回答

59

您可以尝试以下类似的代码。假设您有一个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);
}

使用带有查询 DSL 的 MongoRepository(区分大小写)

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);

25

我知道这是一个旧问题。我刚在另一篇帖子中找到了解决方案。 请使用以下$regex和$options:

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

请查看原答案: https://dev59.com/FHLYa4cB1Zd3GeqPX3Nj#19068401


2
如果你的正则表达式是“test”,那么将返回具有类似标题的文档:test1,test2等。 - neverEugene

6
@Repository
public interface CompetenceRepository extends MongoRepository<Competence, String> {

    @Query("{ 'titre' : { '$regex' : ?0 , $options: 'i'}}")
    List<Competence> findAllByTitreLikeMotcle(String motCle);
}

应该能够完美工作,我在我的项目中使用它,对于法语单词也有效。


1
在仓储模式中,我尝试了这个并且成功了:
@Query("{ 'username' : ?0 }.collation( { locale: 'en', strength: 2 } )")
User findByUserName(String name);

0

是的,您可以这样做,前提是您已经正确设置了它,我建议在您的存储库方法中添加类似以下内容:

{'username': {$regex: /ab/i }})

@Query("{'username': {$regex: /?1/i }})")

List findUsersByUserName(String userName);


0

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接