【问题标题】:Grouping in GraphQL queryGraphQL 查询中的分组
【发布时间】:2021-03-15 12:17:10
【问题描述】:

我是 GraphQl 的新手,正在学习它。目前我有单个数据库表 - student_courses 如下所示:

student_id|   student_name   | course_code | course_name
1              ABC                S-101       DataStructures
1              ABC                S-150       NLP
1              ABC                S-250       Machine learning
2              PQR                S-101       DataStructures
3              XYZ                S-101       DataStructures
3              XYZ                S-150       NLP

我已将模型映射到单个 GraphQL 对象。因此,我将 GraphQL API 响应作为表中每一行的单独 json 对象。

我想了解如何按student_id, student_name 对该表的结果进行分组并获得以下格式的结果:

student_id, student_name, {course_code : course_name}

例如:1, "ABC", {"S-101":"DataStructures", "S-150":"NLP", "S-250":"Machine learning"}

我当前的 GraphQL 查询 -

{
  student_courses() {
    data {
      student_id
      student_name
      course_code
      course_name
    }
  }
}

【问题讨论】:

  • 不查询责任 - 解析者角色
  • 好的,如果你能指出 GraphQL 解析器上的一些好的参考实现来实现这一点,那就太好了。谢谢!
  • IDK ruby​​,在 ruby​​/rails 中关注一些关于 ORM 和 graphql 服务器的教程

标签: api graphql graphql-ruby


【解决方案1】:

很难用你对数据库和后端的评论来回答:graphql 对数据并不聪明。

先提醒一下:

要提供 GraphQL api,您需要一个“graphql 后端”,您可能正在使用像 prismaapollo server 这样的框架,或者如果您的数据库是 PostgreSql,我推荐 postgraphile

这些框架接收和解析 Graphql 查询,并使用称为“解析器”的函数“解析”查询的每个子部分。 它们还可以帮助您连接到数据库并生成获取数据所需的部分代码。

例如,如果您有这样的查询:

      average {
        points
      }

您需要一个解析器来获取“平均”字段,并需要另一个解析器来获取“平均”对象的“点”子字段。

回到你的问题

分组结果将是您在解析器中编码的内容,graphql 引擎不会“知道”如何要求您的数据库进行连接或组查询。

在 postgraphile 上,您可以使用 pg-aggregates plugin 为您执行此操作(因为它专门用于将自身与 postgresql 数据库绑定)。

您将能够像这样解析 Graphql 查询。

query GroupedAggregatesByDerivative {
  allMatchStats {
    byDay: groupedAggregates(groupBy: [CREATED_AT_TRUNCATED_TO_DAY]) {
      keys # The timestamp truncated to the beginning of the day
      average {
        points
      }
    }
    byHour: groupedAggregates(groupBy: [CREATED_AT_TRUNCATED_TO_HOUR]) {
      keys # The timestamp truncated to the beginning of the hour
      average {
        points
      }
    }
  }
}

实际上,这意味着您的解析器将采用一个名为“groupBy”的参数,并根据其值返回不同的数据。

备注:在 Graphql 模式方面,allMatchStats 查询必须进行修改,以便将byDay 字段作为输入,其输出将不是“match”,而是另一个自定义类型,包含例如average 字段。 (请注意,在 postgraphile 插件上面的案例中,会为您生成所有这些)

【讨论】:

    猜你喜欢
    • 2021-11-24
    • 2016-12-28
    • 2019-02-22
    • 2019-09-19
    • 2019-09-02
    • 2020-05-30
    • 2018-12-21
    • 2020-04-26
    • 2020-08-17
    相关资源
    最近更新 更多