在PostgreSQL v9.5 +

时间:2016-02-26 13:42:55

标签: sql postgresql jsonb postgresql-9.5

我使用jsonb_set在postgres中部分更新我的jsonb对象。

这就是文档关于这个功能的说法。

 jsonb_set(
   target jsonb,           # The jsonb value you're amending.
   path text[],            # The path to the value you wish to add to or change, represented as a text array.
   new_value jsonb,        # The new object, key : value pair or array value(s) to add to or change.
   create_missing boolean  # An optional field that, if true (default), creates the value if the key doesn't already exist.
                           #   If false, the path must exist for the update to happen, or the value won't be updated.
 )

我认为create_missing(默认情况下为true)会导致我的jsonb对象中出现未显示的路径,但看起来这只适用于最后一步(例如,不是递归)。

查询

UPDATE myScheme.myTable SET data = jsonb_set(data, $1, $2, true) where id = $3;
如果$1 = {foo,bar,baz}和我当前的data = {foo: {}}

将失败

问题是:如何在PostgreSQL v9.5 +中使用递归创建未存在的子对象来更新我的jsonb对象?

1 个答案:

答案 0 :(得分:0)

您可以使用类似的内容,而不是t放置表格的名称:

UPDATE t SET data = jsonb_set(data,'{foo,bar}','{"baz":{"key1":{},"key2":[2],"key3":3,"key4":"val4"}}'::JSONB);

结果将是:

SELECT jsonb_pretty(data) FROM t;

          jsonb_pretty          
--------------------------------
 {                             +
     "foo": {                  +
         "bar": {              +
             "baz": {          +
                 "key1": {     +
                 },            +
                 "key2": [     +
                     2         +
                 ],            +
                 "key3": 3,    +
                 "key4": "val4"+
             }                 +
         }                     +
     }                         +
 }
(1 row)

使用这种方法(当所有结构都在new_value参数中定义时),您可以自由创建任何类型的嵌套元素(数组,嵌套文档 string 整数值); 另一方面,在path参数中执行此操作将非常棘手。