PostgreSQL:从包含 json 个对象的数组中删除 key/value 对
PostgreSQL: Delete key/value pair from array with json objects
我有一个 table:
CREATE TABLE movies( id text, data jsonb );
INSERT INTO movies(id, data) VALUES (
'1',
{
"actors": [
{
"name": "actor1",
"email": "actor1@somemail.com"
},
{
"name": "actor2",
"email": "actor2@somemail.com"
}
]
}
);
我想要的是从 actors 数组的每个 json 对象中删除 email 字段(键 + 值)。
我尝试了以下解决方案,虽然它确实执行了,但对数组根本没有任何影响:
update movies
set data = jsonb_set(data, '{actors}', (data->'actors') - '{actors, email}')
where id = '1';
删除数组元素需要单独指定索引email
update movies
set data = jsonb_set(data, '{actors}', data -> 'actors' #- '{0,email}' #- '{1,email}')
where id = '1';
路径元素 {1,email}
可能会替换为 {-1,email}
(负整数从末尾开始计算)。
要操作数组中的所有项,您需要使用子查询:
UPDATE movies
SET data = jsonb_set(data, '{actors}', (
SELECT jsonb_agg(actor - 'email')
FROM jsonb_array_elements(data->'actors') actor
))
WHERE id = '1';
我有一个 table:
CREATE TABLE movies( id text, data jsonb );
INSERT INTO movies(id, data) VALUES (
'1',
{
"actors": [
{
"name": "actor1",
"email": "actor1@somemail.com"
},
{
"name": "actor2",
"email": "actor2@somemail.com"
}
]
}
);
我想要的是从 actors 数组的每个 json 对象中删除 email 字段(键 + 值)。
我尝试了以下解决方案,虽然它确实执行了,但对数组根本没有任何影响:
update movies
set data = jsonb_set(data, '{actors}', (data->'actors') - '{actors, email}')
where id = '1';
删除数组元素需要单独指定索引email
update movies
set data = jsonb_set(data, '{actors}', data -> 'actors' #- '{0,email}' #- '{1,email}')
where id = '1';
路径元素 {1,email}
可能会替换为 {-1,email}
(负整数从末尾开始计算)。
要操作数组中的所有项,您需要使用子查询:
UPDATE movies
SET data = jsonb_set(data, '{actors}', (
SELECT jsonb_agg(actor - 'email')
FROM jsonb_array_elements(data->'actors') actor
))
WHERE id = '1';