Spring MongoDB使用带有元组数组的$ in查询不同的字段

Qul*_*ulu 5 java spring repository mongodb spring-data

使用MongoDB的最新Spring数据,我想检索集合中的所有记录,其字段(在我的情况下,两个)与给定的String对数组中的值匹配.

鉴于以下文档结构:

@Document(collection="persons")
@CompoundIndexes({
    @CompoundIndex(name="field_job_idx", def="{ 'field':1, 'job':1 }", unique=true)
})
class Person {
    String field;
    String job;
}
Run Code Online (Sandbox Code Playgroud)

给定以下存储库接口:

interface PersonRepository implements Repository<Person,Long> {
    @Query("{ 'field' : { $in : ?0 } }")
    List<Person> findAnyOfTheseFields(String[] fields);    //this is easy for searching in single-valued array of fields
    @Query("{ 'job' : { $in : ?0 } }")
    List<Person> findAnyOfTheseJobs(String[] jobs);        //this is easy for searching in single-valued array of jobs

    @Query(" WHAT GOES HERE? ")
    List<Person> findAnyOfTheseUniqueFieldAndJobPairs(/* ARRAY OF PAIRS OF STRINGS */);
}
Run Code Online (Sandbox Code Playgroud)

我如何构建findAnyOfTheseUniqueFieldAndJobPairs存储库方法及其注释,以便我可以在persons集合中搜索哪些Person记录的值fieldjob值都存在于给定的对/元组数组中?

我可以逃避来包装选项field,并job在这些包装类的实例给定阵列中的包装类和查询?

我想这样做(原谅可怕的语法,但这就是我的想法):

repository.findAnyOfTheseUniqueFieldAndJobPairs([ ["culinary","chef"], ["law","judge"], ["athletics","goalie"]])
Run Code Online (Sandbox Code Playgroud)

并在存储库中:

@Query("{ 'field','job' : { $in : ?0 } }")
List<Person> findAnyOfTheseUniqueFieldAndJobPairs(Tuple<String,String>[] fieldJobPairs);
Run Code Online (Sandbox Code Playgroud)

Tho*_*mas 0

您可以使用 Spring Data Mongo CriteriaAPI。基于这个答案

Criteria[] criteriaArray = new Criteria[]{
        Criteria.where("field").is("culinary").and("job").is("chef"),
        Criteria.where("field").is("law").and("job").is("judge"),
        Criteria.where("field").is("athletics").and("job").is("goalie")
};

Criteria criteria = new Criteria().orOperator(criteriaArray);
Query query = new Query().addCriteria(criteria);
List<Person> personList = mongoTemplate.find(query, Person.class);
Run Code Online (Sandbox Code Playgroud)