筛选器将查询限制到特定账户或一组 zone、按日期的请求,或来自特定 user agent 的请求等。没有筛选器时,查询可能性能下降,结果可能超出支持的上限,返回的数据也可能很嘈杂。
GraphQL 筛选器由 GraphQL Input Object ↗ 表示,它在节点上公开布尔代数。
您可以在以下资源上将筛选器用作参数:
- zones
- accounts
- tables(datasets)
允许通过 zone ID(zoneTag)查询 zone 相关数据。
zones(filter: {zoneTag: "your Zone ID"}) {
...
}zone 筛选器必须符合以下语法:
filter
{ zoneTag: t }
{ zoneTag_gt: t }
{ zoneTag_in: [t, ...] }不支持复合筛选器(逗号分隔、AND、OR)。
当您知道 zone ID 时,使用 zoneTag: t 和 zoneTag_in: [t, ...] 形式。如果不知道 zone ID,使用 zoneTag_gt: t 形式配合 limit 遍历所有 zone。zone 始终按字母数字排序。
省略筛选器可获取所有 zone 的结果(在支持的上限内)。
account 筛选器使用与 zone 筛选器相同的结构和规则,只是使用 Account ID(accountTag)而不是 Zone ID(zoneTag)。
进行账户范围查询时必须指定 account 筛选器,且不能同时查询多个账户。
table 筛选器要求您至少查询一个节点。使用 AND 运算符创建并组合多节点筛选器。table 筛选器也支持 OR 运算符,您必须显式指定。
以下语法描述 table 筛选器,其中 k 是要筛选的 GraphQL 节点,op 是该节点支持的操作符之一:
filter
{ kvs }
kvs
kv
kv, kvs
kv
k: v
k_op: v
AND: [filters]
OR: [filters]
filters
filter
filter, filters操作符支持因节点类型和节点名称而异。
以下操作符支持所有数组类型:
| 操作符 | 比较 |
|---|---|
has |
数组包含某个值 |
hasall |
数组包含列表中的所有值 |
hasany |
数组至少包含列表中的一个值 |
以下操作符支持所有标量类型:
| 操作符 | 比较 |
|---|---|
gt |
大于 |
lt |
小于 |
geq |
大于或等于 |
leq |
小于或等于 |
neq |
不等于 |
in |
在...之中 |
like 操作符可用于字符串比较,并支持 % 字符作为通配符。
query GeneralExample($zoneTag: string, $start: Time) {
viewer {
zones(filter: { zoneTag: $zoneTag }) {
httpRequestsAdaptiveGroups(
filter: { datetime_gt: $start, clientCountryName: "GB" }
limit: 1
) {
count
}
}
}
}以下 GraphQL 示例展示如何筛选特定节点。后面是对应的 SQL 等价写法。
httpRequestsAdaptiveGroups(filter: {datetime: "2018-01-01T10:00:00Z"}) {
...
}WHERE datetime="2018-01-01T10:00:00Z"以下 GraphQL 示例展示如何对多个字段应用筛选器,此例为两个 datetime 字段。后面是对应的 SQL 等价写法。
httpRequests1hGroups(filter: {datetime_gt: "2018-01-01T10:00:00Z", datetime_lt: "2018-01-01T11:00:00Z"}) {
...
}WHERE (datetime > "2018-01-01T10:00:00Z") AND (datetime < "2018-01-01T10:00:00Z")以下 GraphQL 示例演示在筛选器中使用 OR 操作符。此 OR 操作符在 clientCountryName 字段中筛选值为 US 或 GB 的数据。
httpRequestsAdaptiveGroups(
filter: {
datetime: "2018-01-01T10:00:00Z",
OR:[{clientCountryName: "US"}, {clientCountryName: "GB"}]) {
...
}WHERE datetime="2018-01-01T10:00:00Z"
AND ((clientCountryName = "US") OR (clientCountryName = "GB"))以下 GraphQL 示例展示如何筛选数组字段,仅返回包含特定值的数据。后面是对应的 SQL 等价写法。
mnmFlowDataAdaptiveGroups(filter: {ruleIDs_has: "rule-id"}) {
...
}WHERE has(ruleIDs, 'rule-id')以下 GraphQL 示例展示如何筛选数组字段,仅返回包含多个值的数据。后面是对应的 SQL 等价写法。
mnmFlowDataAdaptiveGroups(filter: {ruleIDs_hasall: ["rule-id-1", "rule-id-2"]}) {
...
}WHERE has(ruleIDs, 'rule-id-1') AND has(ruleIDs, 'rule-id-2')添加 requestSource 筛选器并设为 eyeball,可仅返回网站终端用户的请求、数据传输和访问数据。这将排除 Cloudflare 产品(例如 cache purge、healthchecks、Workers 子请求)在您的 zone 上执行的操作。
目前不支持子查询。您可以使用两个 GraphQL 查询作为此限制的变通方案。