Получить максимальное и минимальное значение с помощью запроса GraphQL

Я работал над 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
      }
    ]
  }
}

Теперь вместо всех значений мне нужны только значения max и min из этого списка.

ОБНОВИТЬ:

Я использую hasura.io с postgreSQL.

2 ответа

Если вы используете Hasura.io, то вы можете использовать настраиваемые запросы API для ORDER BY а также LIMIT для 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
    }
}

GraphQL не имеет собственного способа сделать это. (Если SQL является вашей базой, есть много вещей, таких как ORDER BY, GROUP BYи все, кроме простого столбца, выбирает тот, который GraphQL не предоставляет изначально.)

Если сервер исправлен, но вы получаете ответ на этот запрос, вы можете самостоятельно рассчитать агрегат на стороне клиента.

Если вы тоже управляете сервером и вам нужны такие агрегаты, вы можете добавить их в схему. Учитывая ваш пример запроса, я мог бы добавить слой косвенности между запросом и его результатами.

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

С помощью этой схемы вы можете написать запрос

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

В коде вашего сервера у вас должен быть специальный преобразователь для max поле, которое сгенерировало правильный запрос.

Другие вопросы по тегам