PostgreSQL - 将键添加到 JSONB 数组的每个对象
PostgreSQL - Add key to each objects of an JSONB array
我的数据库包含一个 table,它有一个 jsonb 类型的列,我想使用 [= 更新这些数据的一部分36=] 来自 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":[]}'
UPDATE myTable SET myColumn = (
SELECT jsonb_agg(jsonb_set(
element,
array['A'],
to_jsonb(((element ->> 'A')::jsonb || '{"myArray":[]}')::jsonb)
))
FROM jsonb_array_elements(myColumn::jsonb) element
)::json
UPDATE myTable SET myColumn = (
SELECT jsonb_each((element ->> 'A')::jsonb) || '{"myArray":[]}'::jsonb
FROM jsonb_array_elements(myColumn::jsonb) element
)::json
显然,所有这些测试都以失败告终。我很难理解 postgreSQL 函数的工作原理。
有人可以帮忙吗?
jsonb_array_elements
和 jsonb_set
的方法是正确的想法,但不知何故你以错误的方式嵌套了它们:
UPDATE myTable SET myColumn = jsonb_set(myColumn, '{A}', (
SELECT jsonb_agg( element || '{"myArray":[]}' )
FROM jsonb_array_elements(myColumn -> 'A') element
));
顺便说一句,如果您的列已经有 jsonb
数据类型,则您不需要任何转换。
我的数据库包含一个 table,它有一个 jsonb 类型的列,我想使用 [= 更新这些数据的一部分36=] 来自 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":[]}'
UPDATE myTable SET myColumn = (
SELECT jsonb_agg(jsonb_set(
element,
array['A'],
to_jsonb(((element ->> 'A')::jsonb || '{"myArray":[]}')::jsonb)
))
FROM jsonb_array_elements(myColumn::jsonb) element
)::json
UPDATE myTable SET myColumn = (
SELECT jsonb_each((element ->> 'A')::jsonb) || '{"myArray":[]}'::jsonb
FROM jsonb_array_elements(myColumn::jsonb) element
)::json
显然,所有这些测试都以失败告终。我很难理解 postgreSQL 函数的工作原理。
有人可以帮忙吗?
jsonb_array_elements
和 jsonb_set
的方法是正确的想法,但不知何故你以错误的方式嵌套了它们:
UPDATE myTable SET myColumn = jsonb_set(myColumn, '{A}', (
SELECT jsonb_agg( element || '{"myArray":[]}' )
FROM jsonb_array_elements(myColumn -> 'A') element
));
顺便说一句,如果您的列已经有 jsonb
数据类型,则您不需要任何转换。