Spring Data Mongodb 查找以开头

问题描述 投票:0回答:2

我将 Spring 数据与 mongodb 一起使用。 我有一个名为 place 的集合:

{ 
  "_id" : NumberLong(281469), 
  "_class" : "com.domain.Place", 
  "name" : "paris"
}

我想获取以字符串开头的位置。 在 mongo 控制台中我可以使用以下命令获得结果:

db.place.find({name : {$regex : /^par/, $options: 'i'}})

使用 spring 数据存储库我已经尝试过此操作,但总是给出空结果:

@Query(value="{'name' : {$regex : ?0, $options: 'i'}}")
public Page<PlaceDetails> findByNameStartsWith(String name,Pageable pageable);

在存储库方法的调用中,我以这种方式进行串联:

repository.findByNameStartsWith("/^"+token+"/",new PageRequest(0,10));

虽然此存储库方法有效:

@Query(value="{'name' : ?0}")
public Page<PlaceDetails> findByName(String name,Pageable pageable);

类是这样声明的:

@Document(collection="place")
public class PlaceDetails {
//...
}

知道为什么它不起作用吗?

mongodb spring-data
2个回答
6
投票

StartsWith
自动将必要的包装应用到正则表达式中,因此使用您的客户端代码,您可以有效地将其包装两次。如果您考虑一下:通过您的方法,客户端实际上必须知道starts-with子句是通过正则表达式实现的,这会泄漏内部结构。

就这么简单:

repository.findByNameStartsWith(token, new PageRequest(0,10));

应该可以解决问题。


0
投票

如果你使用

MongoTemplate
那么你可以像这样搜索startsWith(“i”代表忽略大小写)

Query query = new Query();
query.addCriteria(Criteria.where("name").regex("^" + prefix, "i"));

mongoTemplate.find(query, PlaceDetails.class);

EndsWith 就像:

Query query = new Query();
query.addCriteria(Criteria.where("name").regex(suffix + "$", "i"));

mongoTemplate.find(query, PlaceDetails.class);
© www.soinside.com 2019 - 2024. All rights reserved.