← Аналитика / analytics / graphql-api / features
Вложенные структуры
Поддерживаются два вида вложенных структур: массивы и карты. Поля обоих этих типов являются массивами; когда они входят в результат запроса, который уже представляет собой массив объектов, они становятся вложенными массивами.
Массивы
GraphQL API поддерживает два разных вида массивов:
- Некоторые массивы содержат скалярные типы (например,
[String]) и ведут себя как обычные поля, которые можно фильтровать - Некоторые массивы содержат более сложные типы (например,
[Subrequest].) В следующем разделе описано их поведение.
Массивы нескалярных типов ведут себя как единое значение. Пролистывать массив по страницам, фильтровать его, фильтровать по нему, группировать его или группировать по нему невозможно.
С другой стороны, вы можете сами выбрать, какие поля базового типа нужно получить.
Возьмём, например, такие массивы:
type SubRequest {
url: String!
status: Int
}
type Request {
date: Date!
datetime: DateTime!
subRequests: [SubRequest!]!
}Чтобы узнать статус по подзапросу, можно выполнить запрос:
{
requests {
date
subRequests {
# discard the url, only need the status
status
}
}
}Результаты будут такими:
{
"requests": [
{
"date": "2018-01-01",
"subRequests": [{"status": 404}, {"status": 200}, {"status": 404}]
},
{
"date": "2018-01-01",
"subRequests": [{"status": 200}]
}
]
}Карты
Карты ведут себя как массивы, но их можно группировать с помощью sum функция. Они используются в агрегированных наборах данных, например httpRequest1dGroups.
Примеры данных типа Map:
type URLStatsMapElem {
url: String!
requests: Int
bytes: Int
}
type Request {
date: Date!
datetime: DateTime!
urlStatsMap: [URLStatsMapElem!]!
}Запрос:
{
requests {
sum {
urlStatsMap {
url
requests
bytes
}
}
dimensions {
date
}
}
}Ответ:
{
"requests": [
{
"sum": {
"urlStatsMap": [
{
"url": "hello-world.org/1",
"requests": 123,
"bytes": 1024
},
{
"url": "hello-world.org/10",
"requests": 1230,
"bytes": 10240
}
]
}
"dimensions" {
"date": "2018-10-19"
}
},
...
]
}Примеры
Запрос полей типа Array в необработанных наборах данных:
query NestedFields($zoneTag: string, $start: Time, $end: Time) {
viewer {
zones(filter: { zoneTag: $zoneTag }) {
events(limit: 2, filter: { datetime_geq: $start, datetime_leq: $end }) {
matches {
ruleId
action
source
}
}
}
}
}Пример ответа:
{
"data": {
"viewer": {
"zones": [
{
"events": [
{
"matches": [
{
"action": "allow",
"ruleId": "rule-id-one",
"source": "asn"
},
{
"action": "block",
"ruleId": "rule-id-two",
"source": "asn"
}
]
}
]
}
]
}
},
"errors": null
}Запрос полей типа Map в агрегированных наборах данных:
query MapCapacity(
$zoneTag: string
$dateStart: Date
$dateEnd: Date
$start: Time
$end: Time
) {
viewer {
zones(filter: { zoneTag: $zoneTag }) {
httpRequests1mGroups(
limit: 10
filter: {
date_geq: $dateStart
date_leq: $dateEnd
datetime_geq: $start
datetime_lt: $end
}
) {
sum {
countryMap {
clientCountryName
requests
bytes
threats
}
}
dimensions {
datetimeHour
}
}
}
}
}Пример ответа:
{
"data": {
"viewer": {
"zones": [
{
"httpRequests1mGroups": [
{
"dimensions": {
"datetime": "2019-03-08T17:00:00Z"
},
"sum": {
"countryMap": [
{
"bytes": 51911317,
"clientCountryName": "XK",
"requests": 4492,
"threats": 0
},
{
"bytes": 1816103586,
"clientCountryName": "T1",
"requests": 132423,
"threats": 0
},
...
]
}
}
]
}
]
}
},
"errors": null
}