2015-05-08 10 views
12

Mam następujące POJO.Zapytanie repozytorium z parametrem listy w danych źródłowych MongoDB

@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; 
    } 
} 

Próbuję zaimplementować MongoRepository zapytanie, które wyszukuje wszystkie Question s, które zawierają listę tagów. Próbowałem następujące:

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

ale to działa tylko wtedy, gdy List tagów że jestem przechodzących do sposobu w pełni dopasowuje listę tagów przypisanych do pytania w Mongo. Na przykład. jeśli mam pytanie w Mongo z listą tagów [ "t1", "t2", "t3" ], to nie jest zwracana przez findByTags(List), kiedy przekazuję [ "t1", "t2" ] do metody.

Próbowałem następujących także:

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

ale wtedy mój war nie mógł zostać wdrożony do mojego kontenera serwletów w ogóle. (Pojawia się następujący błąd w tym przypadku:

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. 

mógłby Pan doradzić, w jaki sposób do realizacji tego niestandardowego zapytania

Odpowiedz

21

będę odpowiedzieć na moje własne pytanie jak już znalazłem odpowiedź pragnienia?. następujących sekcji w dokumentacji Wiosna danych MongoDB wymienia wszystkie obsługiwane słowa kluczowe, które są wykorzystywane przez wiosnę za wyprowadzenie zapytania:

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

Poniższa implementacja pracuje w przypadku zastosowania opisanego powyżej:

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

fajne odkrycie. czy słowo kluczowe musi znajdować się na końcu nazwy metody? dzięki – Harshana

+1

Co zrobić, jeśli chcemy znaleźć pytania, które mają co najmniej 1 tag? bez znajomości tagu? –

+1

mam !! @Query ("{tags: {$ exists: true}, $ where: 'this.tags.length> 0'}") –

1

Słowo kluczowe ZAWIERAJĄCE mogą być również stosowane:

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

przykład i jak to zapytanie Mongo wygląda następująco:

findByAddressesContaining(Address address) 

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

lista ta może również przyjąć adresu w params.

Zobacz dokumentację: https://github.com/spring-projects/spring-data-mongodb/blob/e28bede416e4ddac19a35dc239388afc90b9cac4/src/main/asciidoc/reference/mongo-repositories.adoc

Powiązane problemy