【发布时间】:2016-03-23 03:50:17
【问题描述】:
Graphql 很棒,我已经开始在我的应用程序中使用它。我有一个显示摘要信息的页面,我需要 graphql 来返回聚合计数?这个可以吗?
【问题讨论】:
标签: graphql
Graphql 很棒,我已经开始在我的应用程序中使用它。我有一个显示摘要信息的页面,我需要 graphql 来返回聚合计数?这个可以吗?
【问题讨论】:
标签: graphql
您将定义一个新的 GraphQL 类型,它是一个包含列表和数字的对象。该数字将由解析器函数定义。
在您的 GraphQL 服务器上,您可以定义解析器函数,作为其中的一部分,您必须编写代码来执行获取聚合计数所需的任何计算和查询。
这类似于您为 REST API 或自定义 REST API 端点编写对象序列化程序,以运行计算聚合计数所需的任何数据库查询。
GraphQL 的优势在于它赋予前端更多权力来确定具体返回的数据。您在 GraphQL 中编写的某些内容与您为 REST API 编写的内容相同。
【讨论】:
GraphQL 本身没有自动聚合功能。
您可以添加一个名为summary 的字段,然后在resolve 函数中计算总数。
【讨论】:
你应该在 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;
}
【讨论】:
... 需要 graphql 来返回聚合计数?这个可以吗?
是的,可以做到。
GraphQL 会自动为您完成吗?不,因为它不知道/不关心您从哪里获取数据源。
怎么样? GraphQL 并不规定您如何获取/改变用户查询的数据。获取请求的聚合数据取决于您的实施。您可以直接从 MongoDB 获取聚合数据并将其返回,或者从数据源获取所需的所有数据并自己进行聚合。
【讨论】:
这取决于您是否将聚合器构建到架构中并能够解析该字段。
您能分享一下您正在运行的 GraphQL Server 类型吗?由于不同的语言有不同的实现,以及不同的服务(如 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
}
【讨论】: