【问题标题】:Can graphql return aggregate counts?graphql 可以返回聚合计数吗?
【发布时间】:2016-03-23 03:50:17
【问题描述】:

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

【问题讨论】:

    标签: graphql


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 很好的解释!我认为主要的要点是 GraphQL 不会为您进行计算和聚合。所有这些都应该发生在 GraphQL 查询对象的 resolve 函数中,需要告诉它检索所需的预聚合数据,对其进行处理,然后返回结果。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      你应该在 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;
          }
      

      【讨论】:

        【解决方案4】:

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

        是的,可以做到。

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

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

        【讨论】:

          【解决方案5】:

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

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

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

          query {
            user(id: "1") {
              name
              summaries {
                count
              }
            }
          }
          
          // returns
          {
            "data": {
              "user": {
                "name": "Steve",
                "summaries": {
                  "count": 10
                }
              }
            }
          }
          

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

          【讨论】:

            【解决方案6】:

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

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

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

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

            【讨论】:

              猜你喜欢
              • 2018-10-26
              • 2020-10-28
              • 1970-01-01
              • 1970-01-01
              • 2017-09-10
              • 2022-10-08
              • 2020-01-29
              • 1970-01-01
              • 2020-10-01
              相关资源
              最近更新 更多