73

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

4

6 回答 6

35

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

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

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

GraphQL 的优势在于它赋予前端更多权力来确定具体返回的数据。您在 GraphQL 中编写的某些内容与您为 REST API 编写的内容相同。

于 2016-03-10T03:46:15.570 回答
17

您应该在 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;
    }
于 2018-06-28T12:27:28.620 回答
17

GraphQL 本身没有自动聚合功能。

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

于 2016-01-09T11:44:43.460 回答
15

... 需要 graphql 来返回聚合计数?这可以做到吗?

是的,这是可以做到的。

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

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

于 2016-03-05T23:48:46.007 回答
2

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

你能分享一下你正在运行什么样的 GraphQL 服务器吗?由于不同的语言有不同的实现,以及不同的服务(如 Hasura、8base 和 Prisma)。

此外,当您说“计数”时,我想象的是关系中的对象计数。如:

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

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

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

于 2019-10-10T19:15:01.653 回答
2

如果您使用 Hasura,在资源管理器中,您肯定会看到一个“聚合”表名,因此,您的查询类似于以下内容:

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

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

"table_name_aggregate": {
      "aggregate": {
        "count": 9973
      }
于 2021-02-08T00:08:40.603 回答