【发布时间】: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
我想使用spring-data mongo 的正则表达式查询使文本搜索不区分大小写。
例如在 Oracle 中:
select * from user where lower(username) like '%ab%'
如何使用spring-data mongo 进行此查询?
提前致谢
【问题讨论】:
标签: full-text-search mongodb-query spring-data-mongodb
在存储库模式中我尝试了这个并且工作了
@Query("{ 'username' : ?0 }.collation( { locale: 'en', strength: 2 } )")
用户 findByUserName(String name);
【讨论】:
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/
【讨论】:
您可以尝试以下方法。假设你有一个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);
【讨论】:
对于数字字段(整数或双精度)的类似查询
db.players.find({
$and: [{
"type": {
$in: ["football"]
}
},
{
$where : "/^250.*/.test(this.salary)"
}]
})
查看详细代码:Spring Boot mongodb like query on int/double using mongotemplate
【讨论】:
@Repository
public interface CompetenceRepository extends MongoRepository<Competence, String> {
@Query("{ 'titre' : { '$regex' : ?0 , $options: 'i'}}")
List<Competence> findAllByTitreLikeMotcle(String motCle);
}
应该可以完美运行,它适用于我的项目。法语单词也可以
【讨论】:
我知道这是一个老问题。我刚刚在另一篇文章中找到了解决方案。 使用 $regex 和 $options 如下:
@Query(value = "{'title': {$regex : ?0, $options: 'i'}}")
Foo findByTitleRegex(String regexString);
【讨论】:
是的,你可以,只要你设置正确,我会在你的存储库方法中添加这样的东西:
{'用户名': {$regex: /ab/i }})
@Query("{'用户名': {$regex: /?1/i }})")
列出 findUsersByUserName(String userName);
【讨论】: