我使用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
对象?
答案 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
参数中执行此操作将非常棘手。