コンテンツにスキップ

ネストされた構造

サポートされている2種類のネストされた構造: 配列マップ。これらのいずれかのタイプのフィールドは配列であり、クエリ結果の一部として、すでにオブジェクトの配列である場合、ネストされた配列になります。

配列

GraphQL APIは2種類の配列をサポートしています:

  • 一部の配列はスカラー型を含み(例えば、[String])、フィルタリングできる通常のフィールドのように機能します。
  • 一部の配列はより複雑な型を含みます(例えば、[Subrequest])。次のセクションではその動作について説明します。

非スカラー型の配列は単一の値として振る舞います。配列をページング、フィルタリング、フィルタリングによる、グループ化、またはグループ化する方法はありません。

一方で、基になる型のどのフィールドを取得したいかを選択できます。

例えば、次のような配列があるとします:

type SubRequest {
url: String!
status: Int
}
type Request {
date: Date!
datetime: DateTime!
subRequests: [SubRequest!]!
}

サブリクエストによってステータスを取得するクエリを実行できます:

{
requests {
date
subRequests {
# urlを無視しステータスのみが必要
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, $dateStart: string, $dateEnd: string, $datetimeStart: string, $datetimeEnd: string) {
viewer {
zones(filter: {zoneTag: $zoneTag}) {
events(limit: 2, filter: {datetime_geq: $datetimeStart,datetime_leq: $datetimeEnd}){
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: string, $dateEnd: string, $datetimeStart: string, $datetimeEnd: string) {
viewer {
zones(filter: {zoneTag: $zoneTag}) {
httpRequests1mGroups(
limit: 10,
filter: {date_geq: $dateStart, date_leq: $dateEnd, datetime_geq: $datetimeStart, datetime_lt: $datetimeEnd}) {
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
}