Spring Data elasticsearch @Query嵌套对象的注释

我有两节课,

@Document public class PracticeQuestion { private int userId; private List questions; // Getters and setters } public class Question { private int questionID; private String type; // Getters and setters } 

我的JSON文档是这样的,

 { "_id" : ObjectId("506d9c0ce4b005cb478c2e97"), "userId" : 1, "questions" : [ { "questionID" : 1, "type" : "optional" }, { "questionID" : 3, "type" : "mandatory" } ] } 

我应该如何使用@Query注释编写查询方法以通过userId和questionID查找PracticeQuestion。

谢谢你的任何建议。

如果要按userId和QuestionId进行搜索。 你有2个选择。

  1. 使用嵌套查询(上例中的问题是一种嵌套对象,弹性搜索支持对嵌套对象的搜索。)。 你可以在这里阅读更多相关信息。

您可以使用如下所示的方法findByUserId创建PracticeQuestionRepository

 public interface PracticeQuestionRepository extends ElasticsearchRepository { @Query("{"query":{"bool":{"must":[{"match":{"userId":"?0"}},{"nested":{"path":"questions","query":{"bool":{"must":[{"match":{"questions.id":"?1"}}]}}}}]}}}")" Page findByUserIdAndQuestionId(String userId, String questionId, Pageable pageable); } 
  1. 如果您不想使用嵌套对象。 De规范化架构并将问题和userId展平在同一级别,然后对userId和QuestionId发出查询。

例如文件1

 { "_id": "506d9c0ce4b005cb478c2e97", "userId": 1, "questionID": 1, "type": "optional" } 

文件2

 { "_id": "506d9c0ce4b005cb478c2e97", "userId": 1, "questionID": 1, "type": "optional" } 

存储库代码

 public interface PracticeQuestionRepository extends ElasticsearchRepository { @Query("{"bool" : {"must" : [ {"field" : {"userId" : "?0"}}, {"field" : {"questionId" : "?1"}} ]}}"") Page findByUserIdAndQuestionId(String userId, String questionId, Pageable pageable); } 

有关更多示例,请参阅此链接