graphql可以返回聚合计数吗?

时间:2015-12-16 20:38:41

标签: graphql

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

6 个答案:

答案 0 :(得分:17)

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

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

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

GraphQL的优势在于它在确定具体返回的数据时为前端提供了更多的权力。您在GraphQL中编写的一些内容与您为REST API编写的内容相同。

答案 1 :(得分:10)

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

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

答案 2 :(得分:8)

  

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

是的,可以做到。

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

如何? GraphQL没有规定如何获取/改变用户查询的数据。由您的实现来获取请求的聚合数据。您可以直接从MongoDB获取聚合数据并将其提供回服务,或者从数据源获取所需的所有数据并自行进行聚合。

答案 3 :(得分:4)

您应该在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 :(得分:1)

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

您可以共享正在运行的哪种GraphQL Server吗?由于不同的语言具有不同的实现以及不同的服务(例如Hasura,8base和Prisma)。

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

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

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

8base默认在关系查询中提供计数汇总。

答案 5 :(得分:0)

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

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

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

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