代码之家  ›  专栏  ›  技术社区  ›  Mita

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

  •  0
  • Mita  · 技术社区  · 8 年前

    我正在编写一个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”和“address”=“add1”
    2. 文档的“name”必须为[“Amy”,“Maya”]之一,或者必须具有以下学校-学院-公司组合之一-

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

    这些值和此类组合的数量可以根据动态发出的web请求中提供的内容而有所不同。

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

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

    @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;
    } 
    

    但是没有任何运气。

    我首先尝试将每个“学校”、“学院”和“公司”收集为单独的列表,并将其作为查询参数提供,但显然,这并不完全正确,因为它将获取具有所有可能值排列的文档,而不是作为这三者的唯一组合。

    请让我知道,如果有任何解决方法,我需要它如上所述。提前谢谢。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Mita    8 年前

    完全按照问题中所述创建了一个类:

    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可读性更强!