在循环中通过键从 jsonb 数组中删除属性

Remove an attribute by its key from a jsonb array in a loop

我尝试通过循环中的 jsonb 数组中的键删除属性

groups = '
[
    {"id": "1", "name": "Ann", "age": 20 },
    {"id": "2", "name": "Margaret", "age": 30 }
]';

FOR i IN 0..(jsonb_array_length(groups) - 1)
LOOP
groups = groups - '{age}';
END LOOP;

/* but nothing happened, I see [{"id": "1", "age": 20, "name": "Ann"}, {"id": "2", "age": 30, "name": "Margaret"}] */

RAISE NOTICE '%', groups;

但什么也没发生。我该怎么做?

在循环的每一步中只能修改数组的单个元素,因此必须使用新变量来聚合结果:

do $$
declare 
    groups jsonb = 
    '[
        {"id": "1", "name": "Ann", "age": 20 },
        {"id": "2", "name": "Margaret", "age": 30 }
    ]';
    new_groups jsonb = '[]';
begin
    for i in 0..jsonb_array_length(groups) - 1
    loop
        new_groups:= new_groups || (groups->i) - 'age';
    end loop;
    raise notice '%', new_groups;
end $$;

NOTICE:  [{"id": "1", "name": "Ann"}, {"id": "2", "name": "Margaret"}]
DO

更好的选择是在没有循环和附加变量的单个查询中执行相同的操作:

do $$
declare 
    groups jsonb = 
    '[
        {"id": "1", "name": "Ann", "age": 20 },
        {"id": "2", "name": "Margaret", "age": 30 }
    ]';
begin
    select jsonb_agg(value- 'age')
    from jsonb_array_elements(groups)
    into groups;
    raise notice '%', groups;
end $$;