我正在尝试以此处指定的格式更新Postrgres数据库中列内的用户事实。
jsonb当前在数据列中并等待更新:
data = { "type1" : ["value1", "value2"], "type2" : ["value3"], "type3" : ["value4"] }
发送到db的jsonb:
new_jsonb = { "type1" : ["value7", "value8"], "type3" : ["value6"]}
jsonb应该如何更新它:
updated_jsonb = { "type1: ["value7", "value8"], "type2": ["value3"], "type3": ["value6"] }
将数据集中最初的值与我们要更新的值进行比较时的基本规则是:
如果传递的new_jsonb
包含不在当前data
jsonb中的键,那么这些键会添加其值。
如果传递的new_jsonb
包含当前data
jsonb中的键,那么这些键都只是替换旧键。
This post做了一个有用的工作,概述了jsonb_set函数的一般用法,但是我很难通过并在数组中进行比较。具体指定path
参数。
所以基本上我被困住的地方不知道要指定的路径是什么。我所拥有的是UPDATE table_name SET data = jsonb_set(data {don't know what path should be}, new) WHERE customer_id = $customerId
。传递的new_jsonb
并不总是以相同的顺序传递键值对。
答案 0 :(得分:2)
UPDATE table_name
SET data = data || $newData
WHERE customer_id = $customerId;
示例:
SELECT
'{ "type1": ["value1", "value2"], "type2": ["value3"], "type3": ["value4"] }'::jsonb ||
'{ "type1": ["value7", "value8"], "type3": ["value6"]}'::jsonb as result
result
---------------------------------------------------------------------------
{"type1": ["value7", "value8"], "type2": ["value3"], "type3": ["value6"]}
(1 row)