Получить максимальное и минимальное значение с помощью запроса 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
поле, которое сгенерировало правильный запрос.