Подтвердить что ты не робот

Запрос хранилища с параметром List в Spring Data MongoDB

У меня есть следующее POJO.

@Document(collection = "questions")
public class Question {

    @Id
    private String id;

    public List<String> getTags() {
        return tags;
    }

    public void setTags(List<String> tags) {
        this.tags = tags;
    }
}

Я пытаюсь реализовать запрос MongoRepository, который находит все Question, содержащие список тегов. Я пробовал следующее:

@Repository
public interface QuestionRepository extends MongoRepository<Question, String> {
    List<Question> findByTags(List<String> tags);
}

но это работает только тогда, когда теги List, которые я передаю методу, полностью соответствуют списку тегов, заданных для вопроса в Mongo. Например. если у меня есть вопрос в Mongo со списком тегов [ "t1", "t2", "t3" ], он не возвращается findByTags(List), когда я передаю [ "t1", "t2" ] методу.

Я также пробовал следующее:

@Repository
public interface QuestionRepository extends MongoRepository<Question, String> {
    @Query("{ tags: { $all: ?0 } }")
    List<Question> findByTags(List<String> tags);
}

но тогда мой war не мог быть полностью развернут в моем контейнере сервлета. (В этом случае я получаю следующую ошибку:

The web application [backend] appears to have started a thread named [cluster-1-db:27017] but has failed to stop it. This is very likely to create a memory leak.

Не могли бы вы посоветовать, как реализовать этот пользовательский запрос?

4b9b3361

Ответ 1

Я отвечу на свой вопрос, поскольку я только что нашел ответ сам. В следующем разделе документа Spring Data MongoDB перечислены все поддерживаемые ключевые слова, используемые Spring для его вывода запроса:

http://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#repository-query-keywords

Следующая реализация работает для описанного выше варианта использования:

@Repository
public interface QuestionRepository extends MongoRepository<Question, String> {
     List<Question> findByTagsIn(List<String> tags);
}

Ответ 2

Ключевое слово CONTAINING также может быть использовано:

@Repository
public interface QuestionRepository extends MongoRepository<Question, String> {
     List<Question> findByTagsContaining(List<String> tags);
}

и как выглядит запрос mongo:

findByAddressesContaining(Address address)

{"addresses" : { "$in" : address}}

Это также может принимать список адресов в параметрах.

См. документацию: https://github.com/spring-projects/spring-data-mongodb/blob/e28bede416e4ddac19a35dc239388afc90b9cac4/src/main/asciidoc/reference/mongo-repositories.adoc