Update jsonb column



我正在尝试以此处指定的形式更新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"] }

将数据集中的原始值与我们要更新的值进行比较时,基本规则是:

  1. 如果向上传递的new_jsonb包含不在当前dataJSON 中的键,则这些键将添加其值。

  2. 如果传递的new_jsonb包含当前dataJSON 中的密钥,则这些密钥都只是替换旧密钥。

这篇文章在概述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)

最新更新