Перейти к основному содержимому
Модуль 15 · Урок 1 из 256/57 в курсе~15 min
Уроки модуля (1/2)

Интеграция JSON и JSONB

Интеграция JSON и JSONB

PostgreSQL переписал правила работы с базами данных, объединив обнадеживающую, надежную природу ACID SQL с динамической, гибкой гибкостью, типичной для NoSQL. Это было сделано путем предложения столбцов, изначально предназначенных для хранения данных JSON.

Внимание: в Postgres почти всегда рекомендуется использовать JSONB. «B» означает «двоичный»: документы JSON, хранящиеся в этих столбцах, теряют свое чисто текстовое форматирование, но получают возможность проверяться, запрашиваться с очень высокой производительностью, манипулироваться и даже индексироваться с помощью классического B-дерева или GIN INDEX.

Навигация по JSON: оператор «Стрелка»

К сожалению, база данных ecommerce в настоящее время не имеет предопределенных столбцов чистого JSON. Однако мы можем создавать временные значения JSON и «выводить» их из текста!

При работе с JSON операторами, которые детализируют объекты и массивы, являются -> (сохраняет данные в чистом виде jsonb/json) или его «расширенная» версия ->> (преобразует обнаруженные данные JSON в текст).

Академический пример, как если бы существовал столбец JSON «метаданные»:

SQL
-- Look up the value associated with the info key
SELECT metadata->'info' FROM users;

-- Drill into info, and grab city as text
SELECT metadata->'info'->>'city' FROM users;
Упражнение#sql.m15.l1.e1
Попыток: 0Загрузка…

Давайте запросим JSON на лету. Спроецируйте этот json-литерал \`'{"user": {"name": "Mario"}}'::json\` и используйте оператор \`->\` в сочетании с текстовой версией (\`->>\`), чтобы извлечь 'name', назвав извлеченный столбец 'user_name'.

Загрузка редактора…
Показать подсказку

Приведите к ::json или ::jsonb и используйте ->'user'->>'name'.

Решение доступно после 3 попыток

Упражнение#sql.m15.l1.e2
Попыток: 0Загрузка…

Что, если мы передадим массив? Доступ к массиву в json_b в Postgres работает по INDEX (отсчет от нуля). Извлеките элемент SECOND как текст из \`'["A", "B", "C"]'::json\` и назовите его "буква".

Загрузка редактора…
Показать подсказку

->>1 (отсчитывается от нуля!)

Решение доступно после 3 попыток