J'ai le POJO suivant.
@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;
}
}
J'essaie d'implémenter une requête MongoRepository
qui trouve tous les Question
qui contiennent une liste de balises. J'ai essayé ce qui suit:
@Repository
public interface QuestionRepository extends MongoRepository<Question, String> {
List<Question> findByTags(List<String> tags);
}
mais cela ne fonctionne que lorsque le List
des balises que je passe à la méthode correspond entièrement à la liste des balises affectées à la question dans Mongo. Par exemple. si j'ai une question dans Mongo avec une liste de balises [ "t1", "t2", "t3" ]
elle n'est pas retournée par findByTags(List)
lorsque je passe [ "t1", "t2" ]
à la méthode.
J'ai également essayé ce qui suit:
@Repository
public interface QuestionRepository extends MongoRepository<Question, String> {
@Query("{ tags: { $all: ?0 } }")
List<Question> findByTags(List<String> tags);
}
mais alors mon war
n'a pas pu être déployé du tout sur mon conteneur de servlet. (J'obtiens l'erreur suivante dans ce cas:
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.
Pourriez-vous nous conseiller sur la façon d'implémenter cette requête personnalisée?
Je vais répondre à ma propre question car je viens de trouver la réponse par moi-même. La section suivante de la documentation Spring Data MongoDB répertorie tous les mots clés pris en charge utilisés par Spring pour sa dérivation de requête:
http://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#repository-query-keywords
L'implémentation suivante fonctionne pour le cas d'utilisation décrit ci-dessus:
@Repository
public interface QuestionRepository extends MongoRepository<Question, String> {
List<Question> findByTagsIn(List<String> tags);
}
Le mot-clé CONTAINING peut également être utilisé:
@Repository
public interface QuestionRepository extends MongoRepository<Question, String> {
List<Question> findByTagsContaining(List<String> tags);
}
exemple et à quoi ressemble la requête mongo:
findByAddressesContaining(Address address)
{"addresses" : { "$in" : address}}
Cela peut également accepter la liste d'adresses dans les paramètres.
Voir la documentation: https://github.com/spring-projects/spring-data-mongodb/blob/e28bede416e4ddac19a35dc239388afc90b9cac4/src/main/asciidoc/reference/mongo-repositories.adoc