将新字段添加到JSONB中的嵌套JSON数组

时间:2018-09-05 07:00:26

标签: json postgresql

我在PostgreSQL表中存储了一个嵌套的JSON结构。

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 :(得分:1)

不幸的是,由于不得不更改多个子对象,我不知道有比解构然后再重建对象更好的方法。变得很毛。

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

编辑:对不起所有编辑,忘记测试多行了。现在应该很好。不确定,也许可以进一步简化它。