← Аналитика / analytics / graphql-api / features
Фильтрация
Фильтры ограничивают запросы, например, конкретным аккаунтом или набором зон, датой запросов либо запросами от определённого user agent. Без фильтров производительность запросов может снижаться, результаты могут превышать поддерживаемые лимиты, а возвращаемые данные могут быть зашумлены.
Структура фильтра
Фильтр GraphQL представлен в виде Входной объект GraphQL ↗, который открывает доступ к булевой алгебре над узлами.
Фильтры можно использовать в качестве аргумента для следующих ресурсов:
- зоны
- аккаунты
- таблицы (наборы данных)
Фильтр зоны
Позволяет запрашивать данные, связанные с зоной, по ID зоны (zoneTag).
zones(filter: {zoneTag: "your Zone ID"}) {
...
}Фильтр зоны должен соответствовать следующей грамматике:
filter
{ zoneTag: t }
{ zoneTag_gt: t }
{ zoneTag_in: [t, ...] }Составные фильтры (через запятую, AND, OR) не поддерживаются.
Используйте zoneTag: t и zoneTag_in: [t, ...] формы, если вы знаете ID зон. Используйте zoneTag_gt: t форму с ограничениями для перебора всех зон, если ID зон неизвестны. Зоны всегда сортируются в алфавитно-цифровом порядке.
Не указывайте фильтр, чтобы получить результаты по всем зонам (до поддерживаемого лимита).
Фильтр аккаунта
Фильтр аккаунта использует ту же структуру и правила, что и фильтр зоны, с той разницей, что применяет ID аккаунта (accountTag) вместо ID зоны (zoneTag).
При запросе в рамках аккаунта необходимо указать фильтр аккаунта, при этом запросить сразу несколько аккаунтов нельзя.
Табличный фильтр (набор данных)
Табличные фильтры требуют, чтобы вы запросили хотя бы один узел. Используйте AND оператор для создания и комбинирования фильтров по нескольким узлам. Табличные фильтры также поддерживают OR оператор, который нужно указывать явно.
Следующая грамматика описывает фильтр таблицы, где 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 |
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.
GraphQL
httpRequestsAdaptiveGroups(filter: {datetime: "2018-01-01T10:00:00Z"}) {
...
}SQL
WHERE datetime="2018-01-01T10:00:00Z"Фильтрация по нескольким полям
Следующий пример GraphQL показывает, как применить фильтр к нескольким полям, в данном случае к двум полям типа datetime. Далее приведён эквивалент на SQL.
GraphQL
httpRequests1hGroups(filter: {datetime_gt: "2018-01-01T10:00:00Z", datetime_lt: "2018-01-01T11:00:00Z"}) {
...
}SQL
WHERE (datetime > "2018-01-01T10:00:00Z") AND (datetime < "2018-01-01T10:00:00Z")Отфильтровать с помощью OR оператор
Следующий пример GraphQL демонстрирует использование OR оператор в фильтре. Этот OR оператор фильтрует по значению US или GB в clientCountryName поле.
GraphQL
httpRequestsAdaptiveGroups(
filter: {
datetime: "2018-01-01T10:00:00Z",
OR:[{clientCountryName: "US"}, {clientCountryName: "GB"}]) {
...
}SQL
WHERE datetime="2018-01-01T10:00:00Z"
AND ((clientCountryName = "US") OR (clientCountryName = "GB"))Фильтрация массива по одному значению
Следующие примеры GraphQL показывают, как отфильтровать поле типа массив, чтобы вернуть только данные, содержащие конкретное значение. Далее приведён эквивалент на SQL.
GraphQL
mnmFlowDataAdaptiveGroups(filter: {ruleIDs_has: "rule-id"}) {
...
}SQL
WHERE has(ruleIDs, 'rule-id')Фильтрация массива по нескольким значениям
Следующие примеры GraphQL показывают, как отфильтровать поле типа массив, чтобы вернуть только данные, содержащие несколько значений. Далее приведён эквивалент на SQL.
GraphQL
mnmFlowDataAdaptiveGroups(filter: {ruleIDs_hasall: ["rule-id-1", "rule-id-2"]}) {
...
}SQL
WHERE has(ruleIDs, 'rule-id-1') AND has(ruleIDs, 'rule-id-2')Фильтрация конечных пользователей
Добавьте requestSource фильтр для eyeball чтобы возвращать данные о запросах, передаче данных и посещениях только для конечных пользователей вашего сайта. При этом будут исключены действия продуктов Cloudflare (например, очистка кеша, проверки состояния, подзапросы Workers) в вашей зоне.
Подзапросы (расширенные фильтры)
Подзапросы в настоящее время не поддерживаются. Это ограничение можно обойти, используя два запроса GraphQL.