【问题标题】:GraphQL | How to implement conditional nesting?GraphQL |如何实现条件嵌套?
【发布时间】:2021-09-19 15:48:27
【问题描述】:

请考虑以下 GraphQL 架构:

type User {
   id: ID!
   events: [Event]
}

type Event {
   id: ID!
   user: User!
   asset: Asset!
}

type Asset {
  id: ID
  price: Number!
  name: String!
}

GraphQL 是一个用于获取嵌套对象的出色框架,但我很难理解条件嵌套是如何实现的。

例子:

我想检索特定user 的所有events,其中asset.price 大于x。

或者

我想检索属于users [] 列表的asset 的所有events

问题:条件嵌套是 GraphQL 中的一个概念吗?它是如何实现的?

旁注:我使用 AWS AppSync,解析器从 AWS DynamoDB 获取数据。

【问题讨论】:

    标签: graphql aws-appsync


    【解决方案1】:

    您可以在任何 GraphQL 查询上定义过滤器/条件,例如:

    query {
      users(permission: 'ADMIN') {
        ...
      }
    }
    

    permission 参数被传递给您的解析器(比如 DynamoDb VTL 模板、Lambda 等),以按照您的意愿进行处理 - 对于 GQL,这只是另一个参数。

    您可以通过创建events 解析器将此概念带入嵌套字段,然后您可以这样调用它:

    query {
      user(id: '123') {
        name
        events(minPrice: 200) {
          nodes: {
            id
            eventName
            eventDate
          }
        }
        dob
        ...
       }
    }
    

    在上面的例子中,我使用了一个简单的minPrice 参数,但你可以做更复杂的事情,比如价格范围,甚至传递运算符(eq、gt、...)。这一切都与 GraphQL 无关 - 都传递给解析器。

    如何在后端实现它取决于您的设置。我使用不带 Amplify 的 AppSync,编写自己的 VTL 模板,并使用提供的 GQL 字段构建 DynamoDb 请求。

    Here 是一个 SO 帖子,展示了如何创建日期过滤器。

    【讨论】:

      猜你喜欢
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2017-07-17
      • 2011-05-06
      • 2020-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多