Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
向JSONB中的嵌套JSON数组添加新字段_Json_Postgresql - Fatal编程技术网

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

向JSONB中的嵌套JSON数组添加新字段,json,postgresql,Json,Postgresql,我在PostgreSQL表中存储了一个嵌套的JSON结构 表用户: id |内容[JSON] JSON: 我想向costs数组中的所有对象添加一个字段“jsonClass”:“Static”,因此我最后有以下内容: { "purchases": [ { "id": 1, "costs": [ { "jsonClass": "Static", "amount": 23 },

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

用户

id |内容[JSON]

JSON:

我想向
costs
数组中的所有对象添加一个字段
“jsonClass”:“Static”
,因此我最后有以下内容:

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

我不知道如何向这种嵌套结构添加值。有人知道如何做到这一点吗?我找到的唯一方法是将它变成文本并进行字符串替换,这不是很有效,我有很多这样的条目。

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

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


编辑:很抱歉所有的编辑,忘记测试多行。现在应该好了。也许可以简化一点,但不确定。

Ca您可以展示您的代码吗?使用正确的规范化数据模型,这将非常容易@悉达多拉马尼哪种代码?我的字符串替换?@a_horse_和_no_name是的,我知道,但给定的数据没有标准化。它是一个用作文档存储的PSQL DB:/它的工作非常出色,但在一个查询中应用这些更改仍然需要太多时间。我会分块做。不幸的是,JSON操作并不快。我不认为我可以写得更快(尽管它可能更紧凑)。我指的是上面没有名字的@a_horse_:P
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
);