首页 > 解决方案 > 向 JSONB 中的嵌套 JSON 数组添加新字段

问题描述

我有一个存储在 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
        }
      ]
    }
  ]
}

我不知道如何为这样的嵌套结构添加值。任何人都知道如何实现这样的事情?我发现的唯一方法是将其设为文本并进行字符串替换,这不是很高效,而且我有很多这样的条目。

标签: jsonpostgresql

解决方案


不幸的是,由于必须更改多个子对象,我不知道比解构然后重建对象更好的方法。它变得非常多毛。

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
);

小提琴

编辑:对不起所有的编辑,忘记测试多行。现在应该好了。可能会简化一点,不确定。


推荐阅读