【问题标题】:Get max and min value using GraphQL query使用 GraphQL 查询获取最大值和最小值
【发布时间】:2019-03-13 02:48:11
【问题描述】:

我一直在研究 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。

【问题讨论】:

  • 也许您可以为这个特殊用例定义一个自定义参数?像schneider(where: ..., onlyFirstAndLast: true) 这样的东西。然后它将使用where 的结果并执行一些仅返回索引0 和索引n-1 的自定义逻辑。不知道hasura是否可以这样做

标签: graphql express-graphql hasura


【解决方案1】:

如果您使用 Hasura.io,那么您可以使用自定义 API 查询 ORDER BYLIMIT 以获得 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
    }
}

【讨论】:

    【解决方案2】:

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

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

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

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

    使用该架构,您可以编写如下查询

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

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

    【讨论】:

    • (我对这种方法有点不满意,主要是如果响应记录有指向其他对象类型的链接,那么人为的“min”和“max”记录就不能有这些链接,或id 字段。更多的重组可以解决这个问题。)
    • 对不起,我没有更新我的问题中的其他信息,我正在使用 hasura.io 并且数据库是 postgreSQL,我不确定我是否可以定义架构,因为我正在准备所有东西哈苏拉。
    • 对于声称如此强大(并且在许多方面确实如此)的东西,不存在这样的基本功能是完全不能接受的。 Apollo graphQL 的 CEO(和 Meteor 的创造者)在我上周末参加的一个编码竞赛上做了一个演讲,我希望我当时就知道这一点,因为我会提出来的。
    猜你喜欢
    • 2022-11-25
    • 2018-12-27
    • 2017-01-20
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 2016-07-09
    相关资源
    最近更新 更多