Java Spring如何在mongo中构建其like*查询?
我的Mongo数据库中有以下文档(\u ID已跳过): 我已为此集合创建了Spring数据存储库:Java Spring如何在mongo中构建其like*查询?,java,spring,mongodb,spring-data,spring-data-mongodb,Java,Spring,Mongodb,Spring Data,Spring Data Mongodb,我的Mongo数据库中有以下文档(\u ID已跳过): 我已为此集合创建了Spring数据存储库: public interface NameRepository extends MongoRepository<Name, ObjectId> { Collection<Name> findByNameLike(String name); } 所以它的行为就像一个智能正则表达式。现在我想自己实施这样的行为: class MyNameRepository {
public interface NameRepository extends MongoRepository<Name, ObjectId> {
Collection<Name> findByNameLike(String name);
}
所以它的行为就像一个智能正则表达式。现在我想自己实施这样的行为:
class MyNameRepository {
MongoOperations mongoOperations; // injected
public Collection<Name> findByName(String like) {
Query query = new Query();
query.addCriteria(Criteria.where("name").regex(like));
return mongoOperations.find(query, Name.class)
}
}
因此,我的自定义方法的工作原理与我在Spring数据存储库中定义的findByNameRegex
方法完全相同。如何实现findByNameLike
行为
为什么我需要这样做:当我需要按许多属性(例如,仅按姓名、按姓名和姓氏、按姓名和邮政编码、按姓名、姓氏和邮政编码等)筛选我的集合时,我更容易支持作为参数的查询,而不是在存储库中创建许多非常长的命名方法。实际上,有一个简单的方法可以将所有
*
转换为*
。除了捕获无效的正则表达式,我的自定义实现可能如下所示:
class MyNameRepository {
MongoOperations mongoOperations; // injected
public Collection<Name> findByName(String like) {
try{
Query query = new Query();
query.addCriteria(Criteria.where("name").regex(toLikeRegex(like)));
return mongoOperations.find(query, Name.class);
} catch(PatternSyntaxException e) {
return Collections.emptyList();
}
}
private String toLikeRegex(String source) {
return source.replaceAll("\\*", ".*");
}
}
对于Spring数据MongoDB 2.x,您可以使用:
String regex=MongoRegexCreator.INSTANCE.toreRegularExpression(userString,MongoRegexCreator.MatchMode.CONTAINING)代码>
class MyNameRepository {
MongoOperations mongoOperations; // injected
public Collection<Name> findByName(String like) {
Query query = new Query();
query.addCriteria(Criteria.where("name").regex(like));
return mongoOperations.find(query, Name.class)
}
}
myNameRepository.findByName("John"); // John, Johny
myNameRepository.findByName("John$"); // John
myNameRepository.findByName("J*ny"); // empty, without error
myNameRepository.findByName("Jo?*ny"); // error (invalid regex)
myNameRepository.findByName("Jo[]]?*ny"); // error (invalid regex)
class MyNameRepository {
MongoOperations mongoOperations; // injected
public Collection<Name> findByName(String like) {
try{
Query query = new Query();
query.addCriteria(Criteria.where("name").regex(toLikeRegex(like)));
return mongoOperations.find(query, Name.class);
} catch(PatternSyntaxException e) {
return Collections.emptyList();
}
}
private String toLikeRegex(String source) {
return source.replaceAll("\\*", ".*");
}
}
String regex = MongoRegexCreator.INSTANCE
.toRegularExpression(userString, Part.Type.EXISTS);