3

我有一张桌子:

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对象中删除电子邮件字段(键+值)。

我尝试了以下解决方案,虽然它确实执行了,但它对数组根本没有任何影响:

update movies
set data = jsonb_set(data, '{actors}', (data->'actors') - '{actors, email}')
where id = '1';
4

2 回答 2

3

要操作数组中的所有项目,您需要使用子查询:

UPDATE movies
SET data = jsonb_set(data, '{actors}', (
  SELECT jsonb_agg(actor - 'email')
  FROM jsonb_array_elements(data->'actors') actor
))
WHERE id = '1';

在线演示

于 2019-11-18T22:49:09.770 回答
0

您需要单独指定索引以删除数组元素email

update movies
   set data = jsonb_set(data, '{actors}', data -> 'actors' #- '{0,email}' #- '{1,email}')
 where id = '1';

路径元素{1,email}可能被替换为{-1,email}从末尾开始计数的负整数)。

Demo

于 2019-11-18T20:36:55.130 回答