powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как обновить поле глубоко в jsonb объекте?
11 сообщений из 11, страница 1 из 1
Как обновить поле глубоко в jsonb объекте?
    #39568891
DennniLA2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сам объект примерно такой:
Код: javascript
1.
2.
3.
4.
5.
data = {
  strips:[
    {id: 1, key: 'value', o: {key2: 'value2'}}
  ]
}



К примеру нужно обновить data.strips[0].o.key2. Подскажите, плз, как это можно сделать одним запросом?
...
Рейтинг: 0 / 0
Как обновить поле глубоко в jsonb объекте?
    #39568925
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DennniLA2Сам объект примерно такой:
Код: javascript
1.
2.
3.
4.
5.
data = {
  strips:[
    {id: 1, key: 'value', o: {key2: 'value2'}}
  ]
}



К примеру нужно обновить data.strips[0].o.key2. Подскажите, плз, как это можно сделать одним запросом?
в любом случае обновится вся запись (будет новая версия записи--писи). т.ч. бороться за доступ к полю по сцылке -- бессмысленно.

т.ч. перестраивайте как угодно -- хоть как текст.
...
Рейтинг: 0 / 0
Как обновить поле глубоко в jsonb объекте?
    #39568944
fte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DennniLA2,

Если в лоб, тока через jsonb ... https://postgrespro.ru/docs/postgresql/10/functions-json.html]
jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean])
...
Рейтинг: 0 / 0
Как обновить поле глубоко в jsonb объекте?
    #39570872
Bsplesk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да на самом деле плоховата всё, как дело начинается с обновление элементов массива (в Postgres 10 обещали улучшения... но возможно отложили).

Вам требуется json или вполне подходит jsonb (не сохраняет порядок ...)
jsonb имеет смысл использовать для хранение небольших(не имеющих многоуровневых структур, вложенных массивов[по крайней мере до 10 версии]).
Крайне неудобно обновлять, когда элементом массива является объект, и допустим в нем необходимо обновить элемент массива .....

Короче postgresql, до уровня DB2/MsSQL котороые умеют хорошо работать с xml/xpath еще, далековато....

Сегодня уже поздно, завтра попробую накидать примеров.
...
Рейтинг: 0 / 0
Как обновить поле глубоко в jsonb объекте?
    #39570880
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BspleskКороче postgresql, до уровня DB2/MsSQL котороые умеют хорошо работать с xml/xpath еще, далековато....

Сегодня уже поздно, завтра попробую накидать примеров.

А причем тут собственно json к xml/xpath? Это вообще разные вещи.
По xml/xpath - это сюда https://www.postgresql.org/docs/10/static/functions-xml.html.

PS: если вы в базе зачем то хотите менять отдельные элементы json - у вас неверная архитектура и эти элементы должны быть в виде полей таблицы. Не надо nosql storage из postgresql делать ;).
...
Рейтинг: 0 / 0
Как обновить поле глубоко в jsonb объекте?
    #39570928
Bsplesk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PS: если вы в базе зачем то хотите менять отдельные элементы json - у вас неверная архитектура и эти элементы должны быть в виде полей таблицы. Не надо nosql storage из postgresql делать ;).

На текущий момент, соглашусь с этим.

Но опять же не обманывать/вводить в заблуждение [про надо и не надо] - те задачи которые ложатся на jsonb [xml/xpath в DB2/MSSQL] напрямую в RDBMS вам не решить , и придется вам строить очередной EAV (с вывертом всей relation - модели наизнанку), а как только (обычно почти сразу) понадобится иерархия/таксономия, начнете модернизировать её до EAV-CR, ну заодно и по таблички на каждый тип, с поддержкой целостности на процедурах/триггерах и.т.д (как апогей смотрим к примеру magento).
По факту строить эмуляцию объектного хранилища данных (на самом деле не вижу ничего в этом ужасного) - все ERP построены на этом г.

Хостеры кстати, активно пиарят готовые вещи, к примеру:
https://www.digitalocean.com/products/object-storage/

Т.к. JSON - JavaScript Object Notation (хотя и Front-end обижаются, что это не совсем js object), и множество текущих проектов в качестве клиентской части имеют имеют исключительно web, а использовать 2 БД NOSQL и "RDBMS", это тот еще геморрой, то как раз и хотят при помощи PostgreSQL убить двух зайцев, где позволяют требования использовать relation, где не позволяют там заместо EAV/+NOSQL BD, использовать jsonb поля (тем более на front_е json). Но тут свои трудности, что по факту jsonb и соответствующая обвязка в postgresql еще не готова (в отличии от DB2/MSSQL, в которых при помощи xml/xpath это все возможно(но xml из front повыпиливали по факту), в postgresql возможности xml/xpath - это слёзы), т.к. front часто просить и изменять данные, или в json_е но в другом более удобном формате. В стеке xml есть Xpath/xlst, в jsonb с этим пока не очень ....
...
Рейтинг: 0 / 0
Как обновить поле глубоко в jsonb объекте?
    #39570987
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BspleskPS: если вы в базе зачем то хотите менять отдельные элементы json - у вас неверная архитектура и эти элементы должны быть в виде полей таблицы. Не надо nosql storage из postgresql делать ;).

На текущий момент, соглашусь с этим.

Но опять же не обманывать/вводить в заблуждение [про надо и не надо] - те задачи которые ложатся на jsonb [xml/xpath в DB2/MSSQL] напрямую в RDBMS вам не решить , и придется вам строить очередной EAV (с вывертом всей relation - модели наизнанку), а как только (обычно почти сразу) понадобится иерархия/таксономия, начнете модернизировать её до EAV-CR, ну заодно и по таблички на каждый тип, с поддержкой целостности на процедурах/триггерах и.т.д (как апогей смотрим к примеру magento).
По факту строить эмуляцию объектного хранилища данных (на самом деле не вижу ничего в этом ужасного) - все ERP построены на этом г.

Хостеры кстати, активно пиарят готовые вещи, к примеру:
https://www.digitalocean.com/products/object-storage/

Т.к. JSON - JavaScript Object Notation (хотя и Front-end обижаются, что это не совсем js object), и множество текущих проектов в качестве клиентской части имеют имеют исключительно web, а использовать 2 БД NOSQL и "RDBMS", это тот еще геморрой, то как раз и хотят при помощи PostgreSQL убить двух зайцев, где позволяют требования использовать relation, где не позволяют там заместо EAV/+NOSQL BD, использовать jsonb поля (тем более на front_е json). Но тут свои трудности, что по факту jsonb и соответствующая обвязка в postgresql еще не готова (в отличии от DB2/MSSQL, в которых при помощи xml/xpath это все возможно(но xml из front повыпиливали по факту), в postgresql возможности xml/xpath - это слёзы), т.к. front часто просить и изменять данные, или в json_е но в другом более удобном формате. В стеке xml есть Xpath/xlst, в jsonb с этим пока не очень ....

Таки чем вас jsonb_set не устраивает? Он же решает именно ту задачу что вы хотите.
...
Рейтинг: 0 / 0
Как обновить поле глубоко в jsonb объекте?
    #39571022
Bsplesk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Предположим есть структура, конечно, динамическая, заранее неизвестная:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
{
  "key_1": "val1",
  "key_2": "val2",
  "key_3": [
    {
      "sub_key_1": "sub_key_val1"
    },
    {
      "sub_key_2": "sub_key_val2"
    },
    {
      "sub_key_3": [
        {
          "sub_sub_key_1": "sub_sub_key_val1"
        },
        {
          "sub_sub_key_2": "sub_sub_key_val2"
        }
      ]
    },
    {
      "sub_key_4": [
        {
          "sub_sub_key_1": "sub_sub_key_val1"
        },
        {
          "sub_sub_key_2": "sub_sub_key_val2"
        }
      ]
    }
  ]
}

Хочу update всех значения, для "key_3" --> index array -->"sub_key_4" --> index array --> sub_sub_key_2" --> "sub_sub_key_val2"
естественно для всех записей в бд, имеющие данные по этому пути.
p.s. без использования pgplsql, pyhlon, jquery
...
Рейтинг: 0 / 0
Как обновить поле глубоко в jsonb объекте?
    #39571027
Bsplesk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При этом, данных значений может быть несколько в одной записи.
"key_3" --> index array -->"sub_key_4" --> index array --> sub_sub_key_2" --> "sub_sub_key_val2"
...
Рейтинг: 0 / 0
Как обновить поле глубоко в jsonb объекте?
    #39571110
Bsplesk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для понимания ....
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
{"task_packets": [
    {
        "state": "PROCEEDING",
        "task_id": 1001
    },
    {
        "state": "REVERTING",
        "task_id": 1002
    }
]}

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
update 
    json_test
set
    jsonb_data = 
        jsonb_set(
            jsonb_data,
            array['task_packets', elem_index::text],
            '{"obj_array": {"state": "PROCEEDING", "task_id": 1004}}'::jsonb,
            true)
from (
    select 
        pos- 1 as elem_index
    from 
        json_test, 
        jsonb_array_elements(jsonb_data->'task_packets') with ordinality arr(elem, pos)
    where
        elem @> '{"stat2": "REVERTING", "task_id": 1011}' = TRUE
    ) sub
;    
...
Рейтинг: 0 / 0
Как обновить поле глубоко в jsonb объекте?
    #39571279
Bsplesk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Указанный выше запрос, обновит только одну запись в json.

Тоесть, если json будет представлять что-то типа:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
{"task_packets": [
    {
        "state": "PROCEEDING",
        "task_id": 1001
    },
    {
        "state": "REVERTING",
        "task_id": 1002
    },
	{
        "state": "REVERTING",
        "task_id": 1002
    },
	{
        "state": "REVERTING",
        "task_id": 1002
    }
]}

за один запуск, будет обновлена только одна запись.
(для замены всех записей соответствующих условию, требуется или выполнить в цикле update одной и тойже записи или сформировать измененный json и сделать один update)

Вообщем разыскивается, запрос для решения данной задачи, без применения plpgsql ....
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как обновить поле глубоко в jsonb объекте?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]