Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.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
PostgreSQL-向JSONB数组的每个对象添加键_Postgresql_Jsonb - Fatal编程技术网

PostgreSQL-向JSONB数组的每个对象添加键

PostgreSQL-向JSONB数组的每个对象添加键,postgresql,jsonb,Postgresql,Jsonb,我的数据库包含一个表,其中有一个列的类型为jsonb,我想使用postgreSQL中的函数/运算符更新这些数据的一部分。考虑到这一点: { "A":[ {"index":"1"}, {"index":"2"} ], "B":[ {"index":"3"}, {"index":"4"} ] } 假设我们向“a”数组中的对象添加了一个带有空数组的键,以便: { "A":[ {"index":"1", "myArray":[]},

我的数据库包含一个表,其中有一个列的类型为jsonb,我想使用postgreSQL中的函数/运算符更新这些数据的一部分。考虑到这一点:

{
  "A":[
    {"index":"1"},
    {"index":"2"}
  ],
  "B":[
    {"index":"3"},
    {"index":"4"}
  ]
}
假设我们向“a”数组中的对象添加了一个带有空数组的键,以便:

{
  "A":[
    {"index":"1", "myArray":[]},
    {"index":"2", "myArray":[]}
  ],
  "B":[
    {"index":"3"},
    {"index":"4"}
  ]
}
如何继续?

我已经尝试过这种方法但没有成功:

UPDATE myTable SET myColumn = (myColumn::jsonb)->>'A' || '{"myArray":[]}'


显然,所有这些测试都是巨大的失败。我很难理解postgreSQL函数是如何工作的


有人可以帮忙吗?

使用
jsonb_数组_元素
jsonb_集
的方法是正确的想法,但不知何故,您将它们嵌套到了错误的位置:

UPDATE myTable SET myColumn = jsonb_set(myColumn, '{A}', (
  SELECT jsonb_agg( element || '{"myArray":[]}' )
  FROM jsonb_array_elements(myColumn -> 'A') element
));
()


顺便说一句,如果你的专栏已经有了
jsonb
数据类型,你不需要任何类型转换。

非常感谢,它可以工作!但我添加了一些更改,因为事实上,我的列是
json
:'),所以我将“myColumn”包含到了一个
to_jsonb()
;)必须添加
其中jsonb_数组长度(myColumn->'A')>0
@belov该查询是在假设每个json对象都有一个
A
属性作为数组的情况下编写的。如果不是这样,则需要添加条件或创建数组。
UPDATE myTable SET myColumn = (
  SELECT jsonb_each((element ->> 'A')::jsonb) || '{"myArray":[]}'::jsonb
  FROM jsonb_array_elements(myColumn::jsonb) element
)::json
UPDATE myTable SET myColumn = jsonb_set(myColumn, '{A}', (
  SELECT jsonb_agg( element || '{"myArray":[]}' )
  FROM jsonb_array_elements(myColumn -> 'A') element
));