使用Spring MongoRepository根据相同查询参数的不同值组合获取所有Mongo文档

时间:2017-12-05 10:48:20

标签: java spring mongodb spring-data spring-data-mongodb

我正在编写一个Web服务,我需要在用户的REST请求响应中提供MongoDb的文档列表。过滤器参数在请求的请求有效负载中提供。我需要使用Spring的MongoRepository接口获取所有文档,这些接口匹配参数组合。直接应用于集合的以下查询以我想要的方式工作:

db.getCollection('userCollection').find({ '$and' : [ { 'admin':'admin1', 'address':'add1'}, {'$or': [{ 'name' : { '$in':['Amy','Maya'] } }, {'school': 'S1', 'college': 'Col1', 'company': 'CompCop'}, {'school': 'S2', 'college': 'Col1', 'company': 'CompShop'}]} ]})

所以我需要做以下事情:

  1. 所有文件必须有" admin" =" admin1"和"地址" =" add1"
  2. 文件必须有" name"作为[" Amy"," Maya"]之一,或者他们必须拥有以下学校 - 公司 - 公司组合之一 -

    {'school': 'S1', 'college': 'Col1', 'company': 'CompCop'}, {'school': 'S2', 'college': 'Col1', 'company': 'CompShop'}

  3. 这些值和此类组合的数量可能会根据动态网络请求中提供的内容而有所不同。

    第二点是我在使用@Query注释在java中使用基于JSON的查询时遇到问题。

    我想将此信息作为以下存储库方法的一部分提供:

    @Query({'$and': [{'admin': ?0, 'address': ?1}, {'$or': [{'name': {'$in': ?2}}, <add solution here for adding list of school-college-company combinations> ]}]})
    public List<Users> find(String admin, String address, List<String> names, <insert parameters for 'school-college-company' combinations>);
    

    我搜索了一个解决方案,我可以提供一个类型为

    的参数列表
    class FilteringClass {
        String school;
        String college;
        String company;
    } 
    

    但没有任何运气。

    我开始尝试收集每个&#34;学校&#34;,&#34;大学&#34;和&#34;公司&#34;作为单独的列表并将它们作为查询参数提供,但显然,这不是很正确,因为它将获取包含值的每个可能排列的文档,而不是三者的唯一组合。

    如上所述,请告诉我是否有我需要的解决方案。提前谢谢。

1 个答案:

答案 0 :(得分:0)

完全按照问题中提到的那样创建了一个类:

class SCCFilter {
String school;
String college;
String company;
} 

当请求来自具有这些参数的用户时,对于请求有效负载中的每个元素,我选择学校,大学和公司值并将其存储在“过滤器”列表中。

(当然,这可以优化以避免重复,但作为上述问题的解决方案,它可以正常工作)

然后我写了以下查询:

@Query("{ '$and' : [ { 'admin' : ?0 , 'address' : ?1 } , { '$or' : [{'name': {'$in': ?2 }}, {'$or': ?3 }] }]}")
public List<Users> find(String admin, String address List<String> names, List<SCCFilter> filters)

这是我在运行时从日志中提取的最终查询,以便在Mongo DB中进行测试(成功):

{ "$and" : [ { "admin" : "admin1" , "address" : "addr1"} , { "$or" : [ { "name" : { "$in" : [ "Amy" , "Maya"]}} , { "$or" : [ {'school': 'S1', 'college': 'Col1', 'company': 'CompCop'}, {'school': 'S2', 'college': 'Col1', 'company': 'CompShop'}]}]}]}

比使用MongoTemplate更具可读性!