我正在尝试以此处指定的形式更新Postrgres db中列内的用户事实。
JSONB 当前在数据列中,正在等待更新:
data = { "type1" : ["value1", "value2"], "type2" : ["value3"], "type3" : ["value4"] }
发送到数据库的 JSONB:
new_jsonb = { "type1" : ["value7", "value8"], "type3" : ["value6"]}
JSONB 在更新后应如何管理:
updated_jsonb = { "type1: ["value7", "value8"], "type2": ["value3"], "type3": ["value6"] }
将数据集中的原始值与我们要更新的值进行比较时,基本规则是:
-
如果向上传递的
new_jsonb
包含不在当前data
JSON 中的键,则这些键将添加其值。 -
如果传递的
new_jsonb
包含当前data
JSON 中的密钥,则这些密钥都只是替换旧密钥。
这篇文章在概述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
并不总是以相同的顺序传递键值对。
使用连接运算符:
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)