Postgres SQL добавить ключ ко всему массиву JSON - PullRequest
0 голосов
/ 23 октября 2018

В моей базе данных есть таблица, в которой есть столбец с именем items, этот столбец имеет тип jsonb, и почти у каждой записи есть такие данные:

{"items": [{"id": "item-id", "sku": "some-sku", "quantity": 1, "master_sku": "some-master-sku"}]}

Мне нужно создать миграциюкоторый добавляет type к каждому элементу, поэтому он должен выглядеть следующим образом:

{"items": [{"id": "item-id", "sku": "some-sku", "quantity": 1, "master_sku": "some-master-sku", "type": "product"}]}

Я должен добавить type к каждой записи, и каждая запись выглядит одинаково.Проблема в том, что в моей таблице около миллиона записей, и я не могу перебрать каждый элемент и добавить новый type, потому что это может занять слишком много времени, и мой сценарий развертывания может дать сбой.

Ребята, как можноя делаю это самым простым способом?

1 Ответ

0 голосов
/ 23 октября 2018

Поскольку формат / содержимое всегда более или менее одинаковы, самый быстрый способ сделать это, вероятно, будет в виде строковой операции, что-то вроде этого:

UPDATE your_table
SET your_field = REGEXP_REPLACE(your_field::TEXT, '\}(.+?)', ', "type": "product"}\1', 'g')::JSONB
WHERE your_field IS NOT NULL;

Пример: https://www.db -fiddle.com / f / fsHoFKz9szpmV5aF4dt7r / 1

Это просто проверяет любой символ }, за которым следует что-то (поэтому мы знаем, что это не последний из "предметов")объект и заменяет его отсутствующим ключом / значением (и любым последующим символом).

Конечно, это практически не проверяет, например, существует ли этот ключ / значение. Где вы хотите находиться между производительностьюи правильность зависит от того, что вы знаете о ваших данных.

...