更新jsonb列

时间:2017-03-29 21:47:28

标签: json postgresql jsonb

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

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

  1. 如果传递的new_jsonb包含不在当前data jsonb中的键,那么这些键会添加其值。

  2. 如果传递的new_jsonb包含当前data jsonb中的键,那么这些键都只是替换旧键。

  3. 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并不总是以相同的顺序传递键值对。

1 个答案:

答案 0 :(得分:2)

使用this example

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)