Перейти к основному содержимому

15.1 Запросы к коллекции

Когда вы запрашиваете данные из коллекции, вы можете использовать набор ограничений для фильтрации объектов.

Для фильтрации необходимо указать набор условий (или фильтров).

Мы используем YAML для формата запроса.

Примечание

Все наборы фильтров начинаются с ключевого слова conditions , все фильтры на первом уровне применяются по условию AND

conditions:
- {operation}
- {operation}

Пример

conditions:
- operation: equal
query:
path: name
expected:
value: Jon

Условия

- Поле:        operation
Тип: string
Описание: Каждое условие должно содержать поле operation
---
- Поле: Тело условия
Описание: В зависимости от выбранной операции, набор полей может
варьироваться

Операции

В этом разделе перечислены все операции, которые вы можете использовать в условиях.

- Операция:    and
Поля: conditions
Тип: []Condition
Описание: Содержит набор условий
---
- Операция: or
Поля: conditions
Тип: []Condition
Описание: Содержит набор условий
---
- Операция: equal
Поля: query, expected
Тип: Expression
Описание: query: Выражение для вычисления значения,
expected: Выражение для вычисления ожидаемого значения
---
- Операция: not_equal
Поля: query, expected
Тип: Expression
Описание: query: Выражение для вычисления значения,
expected: Выражение для вычисления ожидаемого значения
---
- Операция: has_keys
Поля: keys
Тип: []string
Описание: Набор путей для проверки наличия
---
- Операция: not_has_keys
Поля: keys
Тип: []string
Описание: Набор путей для проверки отсутствия

Выражения

В этом разделе перечислены все выражения, которые вы можете использовать в условиях.

- Выражение:   Field
Поле: field
Тип: string
Описание: Это выражение позволяет получить значение поля записи в целом.
Ниже приведены доступные значения для этого выражения:
• object_id
• value
• created_at
---
- Выражение: Path
Поле: path
Тип: string
Описание: Это выражение позволяет заглянуть внутрь значения объекта.
Для просмотра вложенных значений используйте точечный
разделитель.
Примеры:
• a
• a.b
• a.b.c
---
- Выражение: Value
Поле: value
Тип: string, number, array, object, bool
Описание: Это выражение позволяет указать конкретное значение для
дальнейшего сравнения

Примечание для выражения Path

Рассмотрим пример объекта и два фильтра

{
"t1": {
"ddd": "ewwflsdk",
"grz": "d123",
"aaa": "123"
}
}

Фильтр который сработает:

conditions:
- operation: equal
query:
path: t1.grz
expected:
value: d123

Фильтр который не сработает:

conditions:
- operation: equal
query:
path: t1
expected:
value:
grz: d123

Это поведение связано с тем что мы сравниваем весь результат полученный в выражении Path со всем результатом полученным в выражении Value .

Для случаев когда нужно сравнить только часть полученного объекта можно составить выражение из двух и более фильтров.

Например следующее выражение будет игнорировать часть объекта по адресу t1 но сравнивать сразу два значения из вложенного объекта:

conditions:
- operation: equal
query:
path: t1.grz
expected:
value: d123
- operation: equal
query:
path: t1.ddd
expected:
value: ewwflsdk

Примеры фильтрации

Все примеры будут выполнены на основе следующих входных данных.

[
{
"storage_id": "c9d6b296-ab57-435e-a28b-6b207b9674b8",
"collection_name": "users",
"object_id": "8f842609-b710-479b-96d3-0b0f3be62571",
"value": {
"name": "Marta",
"age": 35,
"info": {
"verified": true},
"labels": [
"author",
"reader"
]
},
"created_at": "2006-01-02 15:04:05.999999999 -0700 MST"
},
{
"storage_id": "c9d6b296-ab57-435e-a28b-6b207b9674b8",
"collection_name": "users",
"object_id": "88c90cbe-6aab-43dd-81cb-e7a37580e813",
"value": {
"name": "Joe",
"age": 40,
"info": {
"verified": false,
"banned": true
},
"labels": [
"reader",
"critic"
]
},
"created_at": "2006-01-02 15:04:05.999999999 -0700 MST"
}
]

Базовый фильтр

Сначала найдем совпадение по пути в значении объекта. Для этого нам понадобится оператор equal.

conditions:
- operation: equal
query:
path: name
expected:
value: Marta

Это вернет все объекты, где поле name равно Marta.

{
"storage_id": "c9d6b296-ab57-435e-a28b-6b207b9674b8",
"collection_name": "users",
"object_id": "8f842609-b710-479b-96d3-0b0f3be62571",
"value": {
"name": "Marta",
"age": 35,
"info": {
"verified": true
},
"labels": [
"author",
"reader"
]
},
"created_at": "2006-01-02 15:04:05.999999999 -0700 MST"
}

Теперь найдем всех пользователей, имя которых не Marta. Для этого нам понадобится оператор not_equal.

conditions:
- operation: not_equal
query:
path: name
expected:
value: Marta

Это вернет все объекты, где поле name не равно Marta. В нашем случае мы получим объект с пользователем Joe.

{
"storage_id": "c9d6b296-ab57-435e-a28b-6b207b9674b8",
"collection_name": "users",
"object_id": "88c90cbe-6aab-43dd-81cb-e7a37580e813",
"value": {
"name": "Joe",
"age": 40,
"info": {
"verified": false,
"banned": true
},
"labels": [
"reader",
"critic"
]
},
"created_at": "2006-01-02 15:04:05.999999999 -0700 MST"
}

Теперь запросим всех пользователей с полным совпадением части объекта.

conditions:
- operation: equal
query:
path: info
expected:
value:
verified: false
banned: true

Выражение value автоматически определяет тип значения (строка, объект, список, число).

В этом случае мы снова получим объект пользователя Joe.

{
"storage_id": "c9d6b296-ab57-435e-a28b-6b207b9674b8",
"collection_name": "users",
"object_id": "88c90cbe-6aab-43dd-81cb-e7a37580e813",
"value": {
"name": "Joe",
"age": 40,
"info": {
"verified": false,
"banned": true
},
"labels": [
"critic"
]
},
"created_at": "2006-01-02 15:04:05.999999999 -0700 MST"
}

Множественные фильтры

Фильтрация с OR

conditions:
- operation: or
conditions:
- operation: equal
query:
path: info.banned
expected:
value: true
- operation: equal
query:
path: info.verified
expected:
value: false

Фильтрация с AND

conditions:
- operation: and
conditions:
- operation: equal
query:
path: info.banned
expected:
value: true
- operation: equal
query:
path: info.verified
expected:
value: false

Вложенные фильтры

Вы можете вкладывать условия друг в друга для достижения наилучшего результата фильтрации.

conditions:
- operation: and
conditions:
- operation: equal
query:
path: age
expected:
value: 40
- operation: or
conditions:
- operation: equal
query:
path: info.verified
expected:
value: false
- operation: equal
query:
path: info.banned
expected:
value: true

Поиск сложных объектов

Иногда может понадобиться найти объект, где поля объекта как-то связаны друг с другом.

В этом случае вы можете использовать два выражения Path и сравнить их значения между собой.

conditions:
- operation: equal
query:
path: first_name
expected:
path: last_name

В этом примере, если кто-то укажет одинаковое имя и фамилию, мы получим таких пользователей в ответе.

Вы также можете комбинировать различные типы выражений в одном запросе.

conditions:
- operation: and
conditions:
- operation: equal
query:
path: first_name
expected:
path: last_name
- operation: not_equal
query:
path: first_name
expected:
path: Joe