Graphql отлично работает, и я начал использовать его в своем приложении. У меня есть страница, которая отображает сводную информацию, и мне нужно, чтобы graphql возвращал агрегированные подсчеты? Это можно сделать?
Может ли countqq возвращать агрегат?
Ответ 1
Вы бы определили новый тип GraphQL, который является объектом, который содержит список и число. Число будет определяться функцией распознавателя.
На вашем сервере GraphQL вы можете определить функцию распознавателя и как часть этого, вам нужно будет написать код, который выполняет любые вычисления и запросы, необходимые для подсчета совокупности.
Это похоже на то, как вы должны писать сериализатор объектов для REST API или пользовательскую конечную точку REST API, которая запускает любые запросы к базе данных, необходимые для вычисления совокупных подсчетов.
Сила GraphQL заключается в том, что она дает интерфейсу больше возможностей для определения того, какие данные будут возвращены. Некоторые из того, что вы пишете в GraphQL, будут такими же, как и для REST API.
Ответ 2
В самой GraphQL нет автоматической агрегированной функции.
Вы можете добавить поле под названием summary
, а в функции resolve
вычислить итоговые значения.
Ответ 3
... нужен graphql для возврата счетчиков агрегатов? Это можно сделать?
Да, это можно сделать.
Делает ли GraphQL это автоматически для вас? Нет, потому что он не знает/не заботится о том, где вы получаете свой источник данных.
Как? GraphQL не определяет, как вы получаете/мутируете данные, которые пользователь запросил. Это зависит от вашей реализации, чтобы получить запрошенные агрегированные данные. Вы можете получать агрегированные данные непосредственно из своего MongoDB и обслуживать его, или вы получаете все данные, которые вам нужны, из вашего источника данных и сами выполняете агрегацию.
Ответ 4
Вы должны определить Тип агрегированных данных в Graphql и функцию, которую вы хотите реализовать. Например, если вы хотите написать следующий запрос:
SELECT age, sum(score) from student group by age;
Вы должны определить тип данных, который вы хотите вернуть:
type StudentScoreByAge{
age: Int
sumOfScore: Float
}
и функция Graphql:
getStudentScoreByAge : [StudentScoreByAge]
async function(){
const res = await client.query("SELECT age, sum(score) as sumOfScore
from Student group by age");
return res.rows;
}
Ответ 5
Это зависит от того, встроили ли вы агрегатор в схему и сможете ли разрешить поле.
Можете ли вы рассказать, какой сервер GraphQL вы используете? Поскольку разные языки имеют разные реализации, а также разные сервисы (например, Hasura, 8base и Prisma).
Кроме того, когда вы говорите "считает", я представляю количество объектов в отношении. Например:
query {
user(id: "1") {
name
summaries {
count
}
}
}
// returns
{
"data": {
"user": {
"name": "Steve",
"summaries": {
"count": 10
}
}
}
}
8base предоставляет агрегат по умолчанию для реляционных запросов.