Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring如何在mongo中构建其like*查询?_Java_Spring_Mongodb_Spring Data_Spring Data Mongodb - Fatal编程技术网

Java Spring如何在mongo中构建其like*查询?

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 {

我的Mongo数据库中有以下文档(\u ID已跳过):

我已为此集合创建了Spring数据存储库:

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