Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

入れ子構造

最終更新 Markdown で表示Agent セットアップ

サポートしている入れ子構造は 配列(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
}

役に立ちましたか?