0

我是 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
    }
  }
}
4

1 回答 1

2

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

先提醒几点:

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

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

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

      average {
        points
      }

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

回到你的问题

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

在 postgraphile 上,您可以使用可以为您执行此操作的pg-aggregates 插件(因为它专门用于将自身与 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-03-25T05:49:43.693 回答