ネストされた構造
サポートされている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}