次の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
sを見つけるQuestion
クエリを実装しようとしています。私は次を試しました:
_@Repository
public interface QuestionRepository extends MongoRepository<Question, String> {
List<Question> findByTags(List<String> tags);
}
_
しかし、これは、メソッドに渡すタグのList
がMongoの質問に割り当てられたタグのリストと完全に一致する場合にのみ機能します。例えば。 Mongoでタグのリスト_[ "t1", "t2", "t3" ]
_で質問がある場合、_[ "t1", "t2" ]
_をメソッドに渡すときにfindByTags(List)
によって返されません。
私も次のことを試しました:
_@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.
_
そのカスタムクエリを実装する方法についてアドバイスしてください。
自分で答えを見つけたばかりなので、自分の質問に答えます。 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);
}
CONTAININGキーワードも使用できます。
@Repository
public interface QuestionRepository extends MongoRepository<Question, String> {
List<Question> findByTagsContaining(List<String> tags);
}
例とmongoクエリの様子:
findByAddressesContaining(Address address)
{"addresses" : { "$in" : address}}
これは、paramsでアドレスのリストを受け入れることもできます。
ドキュメントを参照してください: https://github.com/spring-projects/spring-data-mongodb/blob/e28bede416e4ddac19a35dc239388afc90b9cac4/src/main/asciidoc/reference/mongo-repositories.adoc