我需要以某种方式将JSON对象推送到可能存在的JSON对象的嵌套数组 - 请参阅以下JSON代码段中的“pages”。
{
"session_id": "someuuid",
"visitor_ui": 1,
"pages": [
{
"datetime": "2016-08-13T19:45:40.259Z",
"duration,": 0,
"device_id": 1,
"url": {
"path": "/"
}
},
{
"datetime": "2016-08-14T19:45:40.259Z",
"duration,": 0,
"device_id": 1,
"url": {
"path": "/test"
}
},
// how can i push a new value (page) here??
]
"visit_page_count": 2
}
我知道jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean])
(虽然仍然觉得它有点难以理解)但是我想使用它,需要我首先SELECT
整个JSONB列,以便找到知道“页面”中的元素已经存在多少以及使用jsonb_set
将其推送到哪个索引,对吧?我希望在Postgres 9.5 / 9.6中有一种方法可以达到我们在编程语言中所知的相同程度。 pages.push({"key": "val"})
。
使用Postgresql 9.5或9.6执行此操作的最佳和最简单方法是什么?
答案 0 :(得分:6)
jsonb_set()
的技巧是它修改了jsonb
对象的一部分,但它返回整个对象。所以你传递列的当前值和你想要修改的路径(这里的“页面”,作为一个字符串数组),然后你取现有的数组(my_column->'pages'
)并附加||
它的新对象。 jsonb
对象的所有其他部分保持原样。您实际上正在为列分配一个全新的对象,但这是无关紧要的,因为UPDATE
无论如何都会将新行写入物理表。
UPDATE my_table
SET my_column = jsonb_set(my_column, '{pages}', my_column->'pages' || new_json, true);
设置为create_missing
的可选true
参数会添加“pages”对象(如果该对象尚不存在)。