支持GraphQL中的聚合函数

Dam*_*ien 22 graphql

GraphQL对分析解决方案非常感兴趣(想想一个显示图形的webapp).但我找不到任何使用聚合函数的GraphQL示例.这是我的前端完成的大多数查询的主要方面.

对于我的解决方案,我们有3个典型的后端调用.

  1. 搜索
  2. 骨料
  3. 时间序列

假设我们在GraphQL中指定了这种类型

type Person {
  name: String
  age: Int
  create_time: Date
}
Run Code Online (Sandbox Code Playgroud)
  1. 搜索

这似乎很好地由GraphQL处理.这里没问题.

恩.搜索名为Bob的人的年龄{Person(姓名:"Bob"){age}}

  1. 骨料

这是我想在饼图中显示信息的典型情况.所以,我想说我想按年龄计算人数.

这将是PostgreSQL查询:

SELECT age, count(*) from Ticket group by age;
Run Code Online (Sandbox Code Playgroud)

GraphQL中的等价物是什么?

  1. 时间序列这是我想在BarChart中以X轴作为时间显示信息的典型情况.

恩.假设我想计算每小时创建的用户数.

这将是PostgreSQL查询:

SELECT date_trunc('hour', create_time) as create_time_bin, count(*) from Person group by create_time_bin order by create_time_bin ASC;
Run Code Online (Sandbox Code Playgroud)

什么是GraphQL等价查询?

Rya*_*yan 13

GraphQL在一天结束时会响应您定义的类型.您只需将该数据放入类型中即可.无论这是针对这些不同查询的特定类型,还是针对现有类型的数据的字段,都取决于您,但这完全可以归结为.GraphQL在定义类型和所有查询将返回的内容方面确实需要更多的努力,这使得它更加严格,但是其他方面的想法是一些很酷的功能,比如内省和类型检查.如果将这种"临时"数据结构放入GraphQL类型似乎没有逻辑意义,那么如果需要其他数据源,则使用非GraphQL端点并不违法.

  • @Damien,每个GraphQL查询都由resolve()函数响应.您为查询提供的查询参数是此函数的参数.然后,resolve()函数消失并执行任何您想要的操作,比如从其他地方检索SQL查询的结果,然后您可以根据需要聚合该数据,最后返回所有这些作为对GraphQL查询的响应的结果.要点:你应该做聚合,好像resolve()只是另一个返回数字的JS函数.但是查询客户端不需要知道或关心. (7认同)

Gia*_*yen 10

@Damien,这些问题不是GraphQL的问题。

每当你想要做的东西GraphQL您必须定义一个返回数据类型功能要实现规格,有时输入数据的类型来进到你的函数。最后,您编写代码来完成这项工作。

实际上,看起来您是用GraphQL语言(重新)编写代码。

以您想在饼图中显示信息的示例为例:

SELECT age, count(*) from Ticket group by age;
Run Code Online (Sandbox Code Playgroud)

在这里定义您的退货数据是年龄和计数列表:

 type TickGroupByAge {
      age: Int
      count: Int
    }
Run Code Online (Sandbox Code Playgroud)

使用GraphQL语言定义函数或查询:

getTicketGroupByAge : [TickGroupByAge]`
Run Code Online (Sandbox Code Playgroud)

最后编写一个函数来实现上面的查询:

async function(){
    const res = await client.query("SELECT age, count(*) from Ticket group by age");
    return res.rows;
}
Run Code Online (Sandbox Code Playgroud)

@Ryan我完全同意GraphQL强迫您编写很多类型定义来解决一个简单的任务。因此,我最终构建了自己的NextQL-类似于GraphQL的GraphQL 引擎,但更简单。

我的项目支持复杂的嵌套类型定义,使您不必定义很多无用的类型。

  • 顺便说一句,我不认为在建议类型“TickGroupByAge”中将“Ticket”缩短为“Tick”有什么意义。它损害了可读性,而且字符很便宜。 (4认同)