Подтвердить что ты не робот

Может ли countqq возвращать агрегат?

Graphql отлично работает, и я начал использовать его в своем приложении. У меня есть страница, которая отображает сводную информацию, и мне нужно, чтобы graphql возвращал агрегированные подсчеты? Это можно сделать?

4b9b3361

Ответ 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 предоставляет агрегат по умолчанию для реляционных запросов.