Nodul LogoNodul
База данных

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

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

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

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

Примечание

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

conditions:
  - {operation}
  - {operation}

Пример

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

Условия

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

Операции

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

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

Выражения

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

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

Примечание к выражению 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: equa;
            query:
              path: info.verified
            expected:
              value:false
          - operation: equal
            query:
              path: info.banned
            expected:
              value:true

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

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

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

conditions:
  - operation: equal
    query:
      path:
        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