JavaRush /Курси /SQL SELF /Оновлення даних у JSON-об'єктах з використанням js...

Оновлення даних у JSON-об'єктах з використанням jsonb_set() та jsonb_insert()

SQL SELF
Рівень 33 , Лекція 4
Відкрита

Отже, JSONB у PostgreSQL — це потужний інструмент для зберігання складних ієрархічних структур даних. Але що робити, якщо тобі треба оновити значення всередині JSONB-колонки? Наприклад, замінити номер телефону користувача або додати нову категорію в масив? Звучить просто, але JSONB — це не таблиця, де можна напряму змінити значення в одній клітинці. Для оновлення даних у JSON-об'єкті ми будемо використовувати спеціальні функції. Сьогодні головні герої:

  • jsonb_set(): для зміни або додавання значення за вказаним "шляхом".
  • jsonb_insert(): для вставки нового елемента в масив JSON.

Оновлення даних з jsonb_set()

Функція jsonb_set() дозволяє змінити частину JSONB-об'єкта або додати в нього нові ключі та значення.

Загальний синтаксис

jsonb_set(target jsonb, path text[], new_value jsonb, create_missing boolean)
  • target — наш JSONB-об'єкт, який треба оновити.
  • path — масив рядків, що представляє шлях до ключа, який треба змінити.
  • new_value — значення, яке ми хочемо додати або замінити.
  • create_missing — логічний параметр (TRUE або FALSE), який вказує, чи треба створювати відсутні ключі.

Давай розглянемо простий приклад. Уяви, що у нас є таблиця users з колонкою profile типу JSONB, де зберігаються профілі користувачів. Один з користувачів оновлює свій номер телефону. Як ми це зробимо?

-- Створюємо таблицю і додаємо дані
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    profile JSONB
);

INSERT INTO users (profile)
VALUES ('{"name": "Отто", "contact": {"phone": "+1-495-123-45-67"}}');

-- Оновимо номер телефону
UPDATE users
SET profile = jsonb_set(profile, '{contact,phone}', '"8-800-555-35-35"', FALSE)
WHERE id = 1;

-- Перевіримо результат
SELECT profile FROM users WHERE id = 1;

Результат:

{
  "name": "Отто",
  "contact": {
    "phone": "8-800-555-35-35"
  }
}

Вау! Ми змінили номер телефону! Зверни увагу, шлях до ключа вказується через масив рядків '{contact,phone}'.

Додавання нового ключа

Якщо ключ, який ти хочеш оновити, відсутній, ти можеш використати параметр create_missing = TRUE, щоб створити його:

UPDATE users
SET profile = jsonb_set(profile, '{address,city}', '"Берлін"', TRUE)
WHERE id = 1;

-- Перевіримо результат
SELECT profile FROM users WHERE id = 1;

Результат:

{
  "name": "Отто",
  "contact": {
    "phone": "8-800-555-35-35"
  },
  "address": {
    "city": "Берлін"
  }
}

Тепер у нас з'явився новий розділ з адресою. Зручно, правда?

Вставка даних з jsonb_insert()

Функція jsonb_insert() використовується для додавання елементів у масиви всередині JSONB-об'єктів.

Загальний синтаксис

jsonb_insert(target jsonb, path text[], new_value jsonb, insert_after boolean)
  • target — цільовий JSONB-об'єкт.
  • path — масив рядків, що представляє шлях до масиву, в який ти хочеш вставити елементи.
  • new_value — значення, яке треба додати.
  • insert_after — логічний параметр. Якщо FALSE, елемент буде вставлений перед вказаним індексом; якщо TRUE — після.

Наведемо приклад. Припустимо, у нас є таблиця, де в колонці profile зберігається список інтересів користувача. Ми хочемо додати новий інтерес у масив:

-- Додаємо дані для прикладу
UPDATE users
SET profile = jsonb_set(profile, '{interests}', '["спорт", "музика"]', TRUE)
WHERE id = 1;

-- Вставимо новий інтерес "програмування" на початок списку
UPDATE users
SET profile = jsonb_insert(profile, '{interests,0}', '"програмування"', FALSE)
WHERE id = 1;

-- Перевіримо результат
SELECT profile FROM users WHERE id = 1;

Результат:

{
  "name": "Отто",
  "contact": {
    "phone": "8-800-555-35-35"
  },
  "address": {
    "city": "Берлін"
  },
  "interests": [
    "програмування",
    "спорт",
    "музика"
  ]
}

Часті проблеми та як їх уникнути

Робота з jsonb_set() та jsonb_insert() може бути трохи хитрою, якщо не враховувати такі моменти:

  1. Неправильний шлях до ключа. Якщо ти вкажеш невірний шлях або спробуєш оновити неіснуючий елемент без create_missing=TRUE, отримаєш помилку або нічого не зміниться. Завжди перевіряй структуру свого JSON.
  2. Невідповідність типів даних. Пам'ятай, що new_value має бути типу JSONB. Якщо хочеш вставити рядок, обов'язково обгорни його у подвійні лапки ('"значення"').
  3. Перезапис даних. Якщо ти намагаєшся оновити масив без використання акуратних функцій, можеш випадково стерти старі дані. Використовуй jsonb_insert() для безпечного додавання нових елементів.

Приклад помилки:

-- Помилка: невірний шлях
UPDATE users
SET profile = jsonb_set(profile, '{contacts}', '"новий контакт"', FALSE)
WHERE id = 1;

Це викличе помилку, бо в об'єкті profile немає ключа contacts, а create_missing вказано як FALSE.

Як уникнути:

-- Вказуємо create_missing = TRUE
UPDATE users
SET profile = jsonb_set(profile, '{contacts}', '"новий контакт"', TRUE)
WHERE id = 1;

Де це застосовується у реальному житті?

Робота з JSONB — це не просто розвага, це дуже важливий скіл для багатьох сучасних застосунків. Ось кілька реальних прикладів:

  • Зберігання користувацьких налаштувань. JSONB ідеально підходить для динамічних структур даних, таких як налаштування застосунків, які можуть відрізнятися у різних користувачів.
  • Інтеграція з зовнішніми API. JSONB зручно використовувати для зберігання сирих даних з REST API, які повертають JSON-об'єкти.
  • Аналіз великих даних. Вкладені структури JSON дозволяють працювати з даними IoT, логами або аналітикою.

На цьому наш вступний екскурс в оновлення JSON-об'єктів закінчено. Тепер ти знаєш, як вставляти, оновлювати та додавати дані в JSONB, а також уникати типових помилок. У наступній лекції ти дізнаєшся, як об'єднувати JSONB-об'єкти та працювати з ними ще ефективніше!

1
Опитування
Обробка JSON-даних, рівень 33, лекція 4
Недоступний
Обробка JSON-даних
Обробка JSON-даних
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ