サポートしている入れ子構造は 配列(array) と マップ(map) の 2 種類です。どちらの型のフィールドも配列です。クエリ結果の一部になると、結果自体がすでにオブジェクトの配列なので、入れ子の配列になります。
GraphQL API は、次の 2 種類の配列をサポートしています。
- スカラー型を含む配列(例:
[String])は通常のフィールドのように振る舞い、フィルターできます - より複雑な型を含む配列(例:
[Subrequest])もあります。次のセクションで動作を説明します。
非スカラー型の配列は、1 つの値として振る舞います。配列に対するページネーション、フィルター、フィルター条件、グループ化、グループ化キーは使えません。
一方で、基になる型のうち、取得するフィールドは選べます。
たとえば、次のような配列があるとします。
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 などの集計データセットで使います。
マップの例:
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"
}
},
...
]
}生データセットの配列フィールドをクエリします。
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
}集計データセットのマップフィールドをクエリします。
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
}