Добавить новые поля во вложенный массив JSON в JSONB - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть вложенная структура JSON, хранящаяся в таблице PostgreSQL.

Таблица users:

id | content [JSON]

JSON:

{
  "purchases": [
    {
      "id": 1,
      "costs": [
        {
          "amount": 23
        },
        {
          "amount": 34
        }
      ]
    },
    {
      "id": 2,
      "costs": [
        {
          "amount": 42
        }
      ]
    }
  ]
}

Я хотел бы добавить поле "jsonClass": "Static" ко всем объектам в массиве costs, поэтому в конце у меня будет следующее:

{
  "purchases": [
    {
      "id": 1,
      "costs": [
        {
          "jsonClass": "Static",
          "amount": 23
        },
        {
          "jsonClass": "Static",
          "amount": 34
        }
      ]
    },
    {
      "id": 2,
      "costs": [
        {
          "jsonClass": "Static",
          "amount": 42
        }
      ]
    }
  ]
}

Я не мог понять, как добавить значения в такую ​​вложенную структуру. Кто-нибудь знает, как этого добиться? Единственный способ, который я нашел, - это сделать текст и заменить строку, что не очень эффективно, и у меня много таких записей.

1 Ответ

0 голосов
/ 05 сентября 2018

К сожалению, из-за необходимости изменения нескольких подобъектов, я не знаю лучшего способа, чем деконструировать, а затем реконструировать объект. Это становится довольно волосатым.

UPDATE users
SET content=(
  SELECT jsonb_agg(purchase)
  FROM (
    SELECT jsonb_build_object('id', pid, 'purchases', jsonb_agg(cost)) AS purchase
    FROM (
      SELECT pid, cost || '{"jsonClass":"static"}'::jsonb AS cost
      FROM (
        SELECT purchase->'id' AS pid, jsonb_array_elements(purchase->'costs') AS cost 
        FROM jsonb_array_elements(content::jsonb->'purchases') AS purchase
      ) AS Q  
    ) AS R
    GROUP BY pid
  ) AS S
);

Fiddle

РЕДАКТИРОВАТЬ: Извините за все изменения, забыл проверить несколько строк. Должно быть хорошо сейчас. Возможно, можно еще немного упростить, не уверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...