我将 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 {
//...
}
知道为什么它不起作用吗?
StartsWith
自动将必要的包装应用到正则表达式中,因此使用您的客户端代码,您可以有效地将其包装两次。如果您考虑一下:通过您的方法,客户端实际上必须知道starts-with子句是通过正则表达式实现的,这会泄漏内部结构。
就这么简单:
repository.findByNameStartsWith(token, new PageRequest(0,10));
应该可以解决问题。
如果你使用
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);