Reputation: 53
I have a table:
CREATE TABLE movies( id text, data jsonb );
INSERT INTO movies(id, data) VALUES (
'1',
{
"actors": [
{
"name": "actor1",
"email": "[email protected]"
},
{
"name": "actor2",
"email": "[email protected]"
}
]
}
);
What I want is to delete the email field (key + value) from each json object of the actors array.
I've tried the following solution and although it does execute, it doesn't have any effect on the array at all:
update movies
set data = jsonb_set(data, '{actors}', (data->'actors') - '{actors, email}')
where id = '1';
Upvotes: 4
Views: 1969
Reputation: 664406
To manipulate all items in the array, you will need to use a subquery:
UPDATE movies
SET data = jsonb_set(data, '{actors}', (
SELECT jsonb_agg(actor - 'email')
FROM jsonb_array_elements(data->'actors') actor
))
WHERE id = '1';
Upvotes: 4
Reputation: 65218
You need to specify indexes individually to delete the array element email
update movies
set data = jsonb_set(data, '{actors}', data -> 'actors' #- '{0,email}' #- '{1,email}')
where id = '1';
the path element {1,email}
might be replaced by {-1,email}
(Negative integers count from the end).
Upvotes: 0