Graphql 可以返回聚合计数吗?

Graphql 很棒,我已经开始在我的应用程序中使用它了。我有一个显示摘要信息的页面,我需要 Graphql 来返回总计数?这能做到吗?

76775 次浏览

在 GraphQL 本身中没有自动聚合函数。

您可以添加一个名为 summary的字段,并在 resolve函数中计算总计。

... 需要 Graphql 来返回总计数? 这可以做到吗?

是的,可以做到。

GraphQL 会自动为您完成吗?不,因为它不知道/不关心您从哪里获得数据源。

怎么做到的?GraphQL 并不规定如何获取/变换用户查询的数据。获得所请求的聚合数据取决于您的实现。您可以直接从 MongoDB 获取聚合数据并将其返回,或者从数据源获取所需的所有数据并自己进行聚合。

您将定义一个新的 GraphQL 类型,它是一个包含列表和数字的对象。该数字将由解析器函数定义。

在 GraphQL 服务器上,您可以定义解析器函数,作为其中的一部分,您必须编写代码,执行任何计算和查询,以获得聚合计数。

这类似于为 REST API 或自定义 REST API 端点编写对象序列化程序,后者运行计算聚合计数所需的任何数据库查询。

GraphQL 的强大之处在于,它使前端在确定具体返回什么数据方面具有更大的能力。您在 GraphQL 中编写的一些内容将与您为 REST API 编写的内容相同。

你应该在 Graphql 定义一个聚合数据的 类型和一个你想要实现的函数。例如,如果要编写以下查询:

SELECT age, sum(score) from student group by age;

您应该定义要返回的数据类型:

 type StudentScoreByAge{
age: Int
sumOfScore: Float
}

以及 Graphql 函数:

 getStudentScoreByAge : [StudentScoreByAge]
async function(){
const res = await client.query("SELECT age, sum(score) as sumOfScore
from Student group by age");
return res.rows;
}

这取决于是否将聚合器构建到架构中并能够解析该字段。

您能否共享您正在运行的是什么类型的 GraphQLServer?因为不同的语言有不同的实现,也有不同的服务(比如 Hasura、8base 和 Prisma)。

另外,当你说“计数”的时候,我想象的是一个关系中对象的计数,比如:

query {
user(id: "1") {
name
summaries {
count
}
}
}


// returns
{
"data": {
"user": {
"name": "Steve",
"summaries": {
"count": 10
}
}
}
}

默认情况下,8base 为关系查询提供计数聚合。

如果你在浏览器中使用 Hasura,你肯定会看到一个“聚合”的表名,因此,你的查询看起来类似于下面这样:

query queryTable {
table_name {
field1
field2
}
table_name_aggregate {
aggregate { count }
}
}

在结果中,您将看到查询的总行数

"table_name_aggregate": {
"aggregate": {
"count": 9973
}