Добавление вложенного массива Postgres jsonb

#postgresql #jsonb

#postgresql #jsonb

Вопрос:

У меня есть простая таблица со jsonb столбцом

 CREATE TABLE things (
  id SERIAL PRIMARY KEY,
  data jsonb
);
  

с данными, которые выглядят как:

 {
    "id": 1,
        "title": "thing",
        "things": [
            {
                "title": "thing 1",
                "moreThings": [
                    { "title": "more thing 1" }
                ]
            }
        ]
}
  

Итак, как мне добавить внутри глубоко вложенного массива, такого как moreThings ?

Для одноуровневого вложенного массива я мог бы сделать это, и это работает:

 UPDATE posts SET data = jsonb_set(data, '{things}', data->'things' || '{ "text": "thing" }', true);
  

Но то же самое не работает для глубоко вложенных массивов:

 UPDATE posts SET data = jsonb_set(data, '{things}', data->'things'->'moreThings' || '{ "text": "thing" }', true)
  

Как я могу добавить к moreThings ?

Ответ №1:

Это работает просто отлично:

 UPDATE things
SET data =
    jsonb_set(data,
              '{things,0,moreThings}',
              data->'things'->0->'moreThings' || '{ "text": "thing" }',
              TRUE
    )
WHERE id = 1;
  

Если у вас есть таблица, состоящая только из первичного ключа и jsonb атрибута, и вы регулярно хотите манипулировать этим jsonb в базе данных, вы, безусловно, делаете что-то неправильно. Ваша жизнь станет намного проще, если вы еще немного нормализуете данные.