@valentinesowl
Инженер, программист

Как добавить значение в массив jsonb postgresql 9.6?

Есть таблица. В таблице есть поле abilities типа jsonb, которая имеет умолчание:
{
"craft" : [],
"combat" : [],
"harvest" : []
}

Каждый из этих массивов должен состоять из id умений и выглядеть примерно так:
{ "harvest" : [ ["id", "lvl"],["id", "lvl"],["id", "lvl"] ], "craft" : [ ["id", "lvl"],["id", "lvl"],["id", "lvl"] ] }
Каким образом я могу добавлять и удалять значения в эти массивы? Есть ли какой-то объектно ориентированный функционал для простого доступа на изменение к значениям вложенных обьектов?

Дополнительный вопрос:
Есть поле inventory типа jsonb[], умолчание null. Оно должно принимать обьекты {...}, которые должны являться элементами массива этого поля. Каким образом добавлять и удалять объекты в таком случае? Как редактировать свойства каждого отдельного обьекта? К примеру объект имеет поля { "id": 1, "name":goldcoin, "count":20 }. Я хочу изменить count внутри этого объекта, путь он будет первым значением этого поля таблицы. Так же я хочу после добавить в это поле объект { "id":2, "name":sword, "count":1} или удалить этот же объект
  • Вопрос задан
  • 333 просмотра
Решения вопроса 1
@alfangur
в вашем случае, в случае работы с объектом можно пойти таким путем:

DO
$$
DECLARE
objectOrigin jsonb;
objectModingCount jsonb;
objectModingCraft jsonb;
arrayCraft jsonb;
BEGIN
objectOrigin = '{"craft":[], "count":0}'::jsonb;

arrayCraft = objectgetvaluearray(objectOrigin, 'craft', '[]');
arrayCraft = arraypushstring(arrayCraft, 'string');
arrayCraft = arraypushnumber(arrayCraft, '1234567890');
arrayCraft = arraypushboolean(arrayCraft, 'true');
arrayCraft = arraypushobject(arrayCraft, '{}');
arrayCraft = arraypusharray(arrayCraft, '[]');

objectModingCount = objectsetvaluenumber(objectModingCount, 'count', 2);
objectModingCraft = objectsetvaluearray(objectModingCraft, 'craft', arrayCraft);

objectOrigin = objectOrigin || objectModingCount || objectModingCraft;
RAISE NOTICE '%', objectOrigin;
END;
$$
LANGUAGE plpgsql;

NOTICE: {"count": 2, "craft": ["string", 1234567890, true, {}, []]}
CONTEXT: PL/pgSQL function inline_code_block line 21 at RAISE
результат запроса (1 строка) отброшен.

Query returned successfully with no result in 18 msec.


objectgetvaluearray, arraypushstring, arraypushnumber, arraypushboolean, arraypushobject, arraypusharray, objectsetvaluenumber, objectsetvaluearray - это мои обертки над стандартными функциями (устал в коде вечно приводить к типу и всякие скобки и тире писать), обычные getters и setters.

есть еще функция jsonb_set, с ее помощью можно манипулировать данными нужной глубины. почитайте в документации. в документации много описано и с примерами, также загляните в раздел функций в pg_catalog и найдите все функции у которых название начинается на "jsonb_", поиграйтесь с ними.

настоятельно рекомендую изучить особенность конкатенации объектов и массивов jsonb.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы