Вложенный массив Postgres JSONB - PullRequest
0 голосов
/ 08 марта 2019

У меня есть простая таблица с 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 Ответ

1 голос
/ 08 марта 2019

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

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

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

...