使用GraphQL查询获取最大值和最小值

时间:2018-10-08 12:18:57

标签: graphql express-graphql hasura

我一直在研究GraphQL并触发查询,以将JSON响应导入React应用。

但是我需要触发一个查询,该查询将向我返回列中的最大值和最小值。

我已经阅读了GraphQL的文档,但没有找到实现此目的的方法。

{
  schneider(where: {_and: [{device_time: {_gte: "2018-09-04T20:11:42.097+05:30"}}, {device_time: {_lte: "2018-09-04T20:12:43.187+05:30"}}]}) {
    active_energy_received
  }
}

上面的查询为我提供了两个提供的日期之间的值的列表。

{
  "data": {
    "schneider": [
      {
        "active_energy_received": 0
      },
      {
        "active_energy_received": 0
      },
      {
        "active_energy_received": 0
      },
      {
        "active_energy_received": 0
      },
      {
        "active_energy_received": 0
      },
      {
        "active_energy_received": 0
      },
      {
        "active_energy_received": 0
      },
      {
        "active_energy_received": 0
      },
      {
        "active_energy_received": 0
      },
      {
        "active_energy_received": 0
      },
      {
        "active_energy_received": 4.3699998856
      },
      {
        "active_energy_received": 0.82099998
      },
      {
        "active_energy_received": 0.82099998
      },
      {
        "active_energy_received": 4.3699998856
      },
      {
        "active_energy_received": 0.82099998
      },
      {
        "active_energy_received": 4.3699998856
      },
      {
        "active_energy_received": 0.82099998
      },
      {
        "active_energy_received": 4.3699998856
      },
      {
        "active_energy_received": 0.82099998
      },
      {
        "active_energy_received": 4.3699998856
      },
      {
        "active_energy_received": 0.82099998
      },
      {
        "active_energy_received": 4.3699998856
      },
      {
        "active_energy_received": 0
      },
      {
        "active_energy_received": 0.820999979972839
      },
      {
        "active_energy_received": 4.3699998856
      }
    ]
  }
}

现在,我只需要此列表中的最大值和最小值,而不是所有值。

更新:

我将hasura.io与postgreSQL一起使用。

2 个答案:

答案 0 :(得分:2)

如果您使用的是Hasura.io,则可以对ORDER BYLIMIT的结果使用自定义的API查询来MINMAX

MAX值的示例:

query {
  table_name(limit: 1, order_by: {time: desc}) { 
      data 
      time
    }
}

MIN值的示例:

query {
  table_name(limit: 1, order_by: {time: asc}) { 
      data 
      time
    }
}

答案 1 :(得分:0)

GraphQL没有本机方法。 (如果以SQL为基础,那么closeORDER BY之类的东西很多,除了GraphQL本身没有提供的简单列选择之外,其他任何东西都可以选择。)

如果服务器是固定的,但您得到了查询响应,则可以在客户端自己计算聚合。

如果您也控制服务器,并且发现自己需要这样的聚合,则可以将它们添加到架构中。给定您的示例查询,我可能会在查询及其结果之间添加一个间接层。

GROUP BY

使用该架构,您可以编写类似的查询

type Query {
    schneider(where: SchneiderQuery): SchneiderPayload!
}
type SchneiderPayload {
    results: [SchneiderResult!]!
    max: SchneiderResult
    min: SchneiderResult
}

在服务器代码中,您必须为{ schneider(where: { ... }) { max { active_energy_received } } } 字段使用一个特殊的解析器,以生成正确的查询。