我对GraphQL非常感兴趣的解析解决方案(想想显示图形的webapp)。但我找不到任何使用聚合函数的GraphQL示例。这是我的前端完成的大多数查询的主要方面。
对于我的解决方案,我们有3个典型的后端调用。
假设我们在GraphQL中指定了这种类型
type Person {
name: String
age: Int
create_time: Date
}
GraphQL似乎很好地处理了这个问题。这里没问题。
离。搜索名为Bob的人的年龄 { 人(姓名:" Bob"){ 年龄 } }
这是我想在饼图中显示信息的典型情况。所以,我想说按年龄计算人数。
这是PostgreSQL查询:
SELECT age, count(*) from Ticket group by age;
GraphQL中的等价物是什么?
离。假设我想计算每小时创建用户的数量。
这是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;
GraphQL等效查询是什么?
答案 0 :(得分:12)
GraphQL,在一天结束时,使用您定义的类型进行响应。您只需将该数据放入类型中即可。无论这是针对这些不同查询的特定类型,还是针对现有类型的数据的字段,都取决于您,但这完全可以归结为。 GraphQL在定义类型和所有查询将返回的内容方面确实需要更多的努力,这使得它更加严格,但是其他方面的想法是一些很酷的功能,比如内省和类型检查。如果从某种意义上来说,将某种特定的" ad hoc"将数据结构转换为GraphQL类型,如果需要其他数据源,则使用非GraphQL端点并非违法。
答案 1 :(得分:6)
每当您想在GraphQL中执行某些操作时,您必须定义返回数据的类型,您实施的功能的规范,有时还需要输入数据的类型< / strong>进入您的功能。最后你编写代码来完成这项工作。
实际上,看起来您(重新)用GraphQL语言编写代码。
以想要在饼图中显示信息的示例为例:
SELECT age, count(*) from Ticket group by age;
此处定义您的返回数据是年龄和计数列表:
type TickGroupByAge {
age: Int
count: Int
}
使用GraphQL语言定义函数或查询:
getTicketGroupByAge : [TickGroupByAge]`
最后写一个函数来实现上面的查询:
async function(){
const res = await client.query("SELECT age, count(*) from Ticket group by age");
return res.rows;
}
@Ryan我完全同意你的看法,GraphQL强迫你编写很多类型定义来解决一个简单的任务。出于这个原因,我最终建立了自己的NextQL - GraphQL-liked engine,它类似于GraphQL但更简单。
我的项目支持复杂的嵌套类型定义,这使您无法定义许多无用的定义。
答案 2 :(得分:1)
查看https://github.com/niclasko/Cypher.js(注意:我是作者)
与该问题有关。它可用于查询和汇总来自JSON端点的数据:
load json from "http://url/person" as l return l.age, count(1)
甚至还有条形图功能:
load json from "http://url/person" as l return barchart(toint(l.age)) as age_distribution
下面是查询复杂的JSON文档并对其进行汇总分析的示例: