jsonpath

Тема дорожной карты · PostgreSQL

JSONPath — язык запросов для навигации и фильтрации документов JSONB в PostgreSQL, введённый в PostgreSQL 12 как реализация стандарта ISO SQL/JSON; он предоставляет более выразительные путевые выражения по сравнению со старыми операторами -> / #>. Основные функции — jsonb_path_query(), jsonb_path_exists() и jsonb_path_match() — принимают значение JSONB и путевое выражение, например '$.store.books[*] ? (@.price < 10)', для извлечения, проверки наличия или сопоставления значений глубоко внутри вложенного документа в реляционной базе данных. Выражения JSONPath поддерживают арифметику, операторы сравнения, методы типов (.type(), .size(), .datetime()) и фильтры с синтаксисом ? (@.key == "value"), обеспечивая богатую оптимизацию документных запросов без извлечения промежуточных значений в коде приложения. Операторы @@ и @? предоставляют jsonb_path_match и jsonb_path_exists соответственно в виде инфиксных операторов, совместимых с GIN-индексированием через jsonb_path_ops, что делает JSONPath высокопроизводительным вариантом для индексируемого поиска по документам в PostgreSQL.

Как это работает

jsonpath делает Postgres конкурентным document-store. JSONB бинарный, быстрее JSON для запросов, поддерживает GIN-индексы. Операторы: -> (поле как JSON), ->> (как текст), @> (containment), ? (ключ существует), #>> (глубокий путь как текст). jsonb_set/jsonb_insert мутируют; jsonb_agg/jsonb_object_agg агрегируют. GIN-индекс на JSONB-колонке делает containment-запросы быстрыми — обязателен для JSONB-фильтров.

Когда применять

JSONB — для semi-structured данных, форма которых меняется per row (config-блобы, audit-payload, third-party event body). Реляционные колонки + плотная схема — для предсказуемых форм; реляционные запросы в 5-10× быстрее JSONB на тех же данных при известной схеме. Не используйте JSONB как "schema escape hatch" — теряете constraint, foreign key, type-check.

Типичные ошибки

Ловушки jsonpath: структурированные поля как JSONB "для гибкости" с запросами по каждому пути (нет enforce схемы, планировщик не видит реальную статистику); огромные JSONB-блобы (per-row TOAST), дорогие row update; нет GIN-индекса и жалобы что @> медленно; -> где нужен ->> (получаете JSON-quoted строки, не текст).

Связанные понятия

Полезные ресурсы