3

我一直在研究 GraphQL 并触发查询以将 JSON 响应获取到反应应用程序中。

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

我已经浏览了 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 一起使用。

4

2 回答 2

7

如果您使用的是 Hasura.io,那么您可以使用自定义的 API 查询ORDER BYLIMIT获取MIN结果MAX

值示例MAX

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

值示例MIN

query {
  table_name(limit: 1, order_by: {time: asc}) { 
      data 
      time
    }
}
于 2018-11-26T22:13:13.990 回答
0

GraphQL 没有本地方式来执行此操作。(如果 SQL 是您的基础,那么除了简单的列选择之外,还有很多 GraphQL 本身不提供的ORDER BY东西GROUP BY。)

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

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

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

使用该模式,您可以编写如下查询

{
    schneider(where: { ... }) {
        max { active_energy_received }
    }
}

在您的服务器代码中,您必须为max生成正确查询的字段提供一个特殊的解析器。

于 2018-10-08T12:28:44.240 回答