首页 > 解决方案 > GraphQL 如何支持 AND-OR 查询条件?

问题描述

我是 GraphQL 的新手。要求从 CUSTOMERS 表中查询所有符合条件的数据,满足条件:GENDER == 'MALE' or 'AGE' >= 20。GQL 应该是什么样的?

标签: graphqlgraphql-java

解决方案


之前有人提出过类似的建议,但被拒绝了。这意味着 GraphQL 本身不支持它,您必须自己推出它。

根据我所看到的几种方法:

(1) 定义您自己的查询语言,例如stackoverflowShopify所做的:

type Query{
    customers (query:String) : [Customer]
}

查询变为:

{
  customers (query : "GENDER == 'MALE' or 'AGE' >= 20"){
    id
    name
  }
}

(2) 定义您自己的输入对象模型,可以覆盖所有需要的搜索需求。Prisma尝试在OpenCRUD规范中定义一个。你可以看看它的想法。例如,您可以定义一个输入模型,如:

input CustomerFilter {
     AND        :  [CustomerFilter]
     OR         :  [CustomerFilter]

    # Define the fields that you support to search
     gender     : String
     gender_not : String
     ....
     ....
     ...
     ...
     age        : Int
     age_gte    : Int
}

type Query{
    customers (filter:CustomerFilter) : [Customer]
}

查询变为:

{
  customers (filter : {
   OR: [
     { gender : 'MALE' } ,
     { age_gte: 20 }
    ]
  }){
    id
    name
  }
}

是另一个可供参考的过滤器模型。我们的想法是对其进行定制,使其足以处理您的所有应用程序需求,而不会引入任何不必要的过滤复杂性。

此外,如果它可能会返回许多数据,您很可能需要考虑分页之类的东西。这意味着您必须为每个查询的输入参数添加偏移量和限制,以某种方式限制返回的记录数,如果您正在执行基于偏移量的分页,或者如果您想在游标中执行,请查看Relay Specification -基于分页样式。


推荐阅读