支持两种嵌套结构:数组和 map。这两种类型的字段都是数组;当它们成为查询结果的一部分(本身已是对象数组)时,会变成嵌套数组。
GraphQL API 支持两种不同类型的数组:
- 某些数组包含标量类型(例如
[String]),行为与普通字段类似,可进行筛选 - 某些数组包含更复杂的类型(例如
[Subrequest])。以下部分描述其行为。
非标量类型的数组作为单个值运行。无法对数组进行分页、筛选、按数组筛选、分组或按数组分组。
另一方面,您可以选择要获取的底层类型的哪些字段。
例如,给定如下数组:
type SubRequest {
url: String!
status: Int
}
type Request {
date: Date!
datetime: DateTime!
subRequests: [SubRequest!]!
}您可以运行查询以按子请求获取 status:
{
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}]
}
]
}Map 的行为类似数组,但可以使用 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"
}
},
...
]
}在原始数据集中查询数组字段:
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
}