---
metadata:
  - name: generator
    content: Diplodoc Platform v5.57.3
alternate:
  - https://ydb-platform--ydb.viewer.diplodoc.com/en/recipes/json-search/json-index-typecheck.md
  - https://ydb-platform--ydb.viewer.diplodoc.com/ru/recipes/json-search/json-index-typecheck.md
  - href: https://ydb-platform--ydb.viewer.diplodoc.com/ru/recipes/json-search/json-index-typecheck.md
    type: text/markdown
    title: Markdown version
  - href: https://ydb-platform--ydb.viewer.diplodoc.com/ru/llms.txt
    type: text/markdown
    title: llms.txt
sourcePath: ru/core/recipes/json-search/json-index-typecheck.md
---
> **Documentation Index:** Fetch the complete configuration index at https://ydb-platform--ydb.viewer.diplodoc.com/ru/llms.txt

# Проверка типа поля и наличия пути

Этот рецепт показывает, как [JSON-индекс](https://ydb-platform--ydb.viewer.diplodoc.com/ru/dev/json-indexes.md) применяется для проверки структуры документов: наличие конкретного пути, тип значения по пути и т. п. Эти задачи часто встречаются при работе с разнородными JSON-документами, когда часть полей опциональна или может иметь разный тип.

## Подготовка

```yql
CREATE TABLE documents (
    id Uint64,
    payload JsonDocument,
    PRIMARY KEY (id),
    INDEX json_idx GLOBAL USING json ON (payload)
);

UPSERT INTO documents (id, payload) VALUES
    (1, JsonDocument(@@{"archived": false, "value": 1,    "data": [1, 2, 3]}@@)),
    (2, JsonDocument(@@{"archived": false, "value": 2,    "data": "plain text"}@@)),
    (3, JsonDocument(@@{"archived": true,  "value": 3,    "data": {"nested": true}}@@)),
    (4, JsonDocument(@@{"archived": false, "value": null, "meta": "no data field"}@@));
```

## Найти документы, у которых поле содержит массив

Метод JsonPath `.type()` возвращает строковое имя типа значения по указанному пути. Это позволяет фильтровать документы по типу содержимого:

```yql
SELECT id
FROM documents VIEW json_idx
WHERE JSON_VALUE(payload, '$.data.type()' RETURNING Utf8) = "array"u;
```

В индекс попадает токен пути `$.data` — метод `.type()` завершает построение токена пути. Точная проверка строкового значения `"array"` выполняется пост-фильтром.

Результат:

```text
id
1
```

Полный список значений, возвращаемых методом `.type()`, приведён в описании синтаксиса [JsonPath](https://ydb-platform--ydb.viewer.diplodoc.com/ru/yql/reference/builtins/json.md#jsonpath).

## Найти документы, у которых поле является не пустым массивом

Метод `.size()` возвращает количество элементов массива (или 1 для скаляра, 0 для отсутствующего пути). В комбинации с фильтром по типу:

```yql
SELECT id
FROM documents VIEW json_idx
WHERE JSON_VALUE(payload, '$.data.type()' RETURNING Utf8) = "array"u
  AND JSON_VALUE(payload, '$.data.size()' RETURNING Int64) > 0;
```

Оба фрагмента индексируются по соответствующим путям, а точные значения проверяются пост-фильтром. Результат: `id = 1`.

## Найти документы со значением `false` или `null`

Для проверки «значение равно `false`» или «значение равно `null`» используйте JsonPath внутри `JSON_EXISTS`, а не `JSON_VALUE(...) IS NULL`:

```yql
-- Значение поля 'archived' равно false
SELECT id
FROM documents VIEW json_idx
WHERE JSON_EXISTS(payload, '$.archived ? (@ == false)');

-- Значение поля 'value' равно null
SELECT id
FROM documents VIEW json_idx
WHERE JSON_EXISTS(payload, '$.value ? (@ == null)');
```

В операцию поиска по индексу попадает путь `$.archived` (или `$.value`) и значения `false` или `null`, соответственно.

{% note info %}

Указанные выше условия отбирают документы, в которых указанный атрибут явно установлен в значение false или null. Проверку отсутствия атрибута нельзя выполнить с помощью JSON-индекса.

{% endnote %}

## Подробнее

* [JSON_EXISTS](https://ydb-platform--ydb.viewer.diplodoc.com/ru/dev/json-indexes.md#json-exists) — что допустимо в выражениях JsonPath.
* [JSON_VALUE](https://ydb-platform--ydb.viewer.diplodoc.com/ru/dev/json-indexes.md#json-value) — что допустимо при извлечении значений.
* [JsonPath: методы](https://ydb-platform--ydb.viewer.diplodoc.com/ru/yql/reference/builtins/json.md#jsonpath) — список методов (`type`, `size`, `keyvalue`, ...) и предикатов JsonPath.
