如何更新json类型的json中的任何字段?它应该接受一个对象或一个键数组,如果存在则更新键,否则创建



nodejs和Postgres中的通用函数,用于在Postgres中更新JSON类型的JSON列中的键。

我尝试了下面的查询:

update contacts set contact_data = jsonb_set(contact_data, '{order_id}', '${order_date}', '${product_name}') where id = ${id};

但问题是每次我都需要指定键。我需要一些通用的东西,一些接受一组键并更新它们的东西。每次调用函数时,键可能会变化。

我试图避免循环,因为每次更新被触发,Postgres重写整行或至少这是我所知道的。

关于这个问题,如果你需要更多的说明,请告诉我。谢谢。

此解决方案将jsonb数据转换为文本,以便与jsonb数据结构无关:

传递给函数jsonb_key_replace一个old_keys数组,该数组将被一个new_keys数组替换。函数jsonb_key_replace迭代聚合函数replace_agg,并将结果转换为jsonb:

CREATE OR REPLACE FUNCTION replace(str1 text, str2 text, old text, new text)
RETURNS text LANGUAGE sql IMMUTABLE AS
$$
SELECT replace(COALESCE(str1,str2), old, new) ;
$$ ;
DROP AGGREGATE IF EXISTS replace_agg (text, text, text) ;
CREATE AGGREGATE replace_agg (text, text, text)
( sfunc = replace
, stype = text
) ;
CREATE OR REPLACE FUNCTION jsonb_key_replace
( jsonb_to_update jsonb
, old_keys text[]
, new_keys text[]
)
RETURNS jsonb LANGUAGE sql IMMUTABLE AS
$$
SELECT replace_agg(jsonb_to_update :: text, '"' || l.old || '":', '"' ||  l.new || '":') :: jsonb
FROM unnest(old_key, new_key) AS l(old, new) ;
$$ ;

最新更新