跳转到内容
搜索文档

嵌套结构

最后更新 查看 MarkdownAgent 设置

支持两种嵌套结构:数组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

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
}

这篇文档对您有帮助吗?