Dac*_*d3r 5 postgresql jsonb postgresql-9.5
我需要以某种方式将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
}
Run Code Online (Sandbox Code Playgroud)
我知道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这是最好和最简单的方法吗?
诀窍jsonb_set()在于它修改了jsonb对象的一部分,但它返回整个对象.因此,您将列的当前值和要修改的路径(此处为"pages",作为字符串数组)传递给它,然后获取现有数组(my_column->'pages')并将||新对象追加到它.jsonb对象的所有其他部分保持原样.您实际上正在为列分配一个全新的对象,但这无关紧要,因为UPDATE无论如何都要将新行写入物理表.
UPDATE my_table
SET my_column = jsonb_set(my_column, '{pages}', my_column->'pages' || new_json, true);
Run Code Online (Sandbox Code Playgroud)
create_missing设置为true此处的可选参数会添加"pages"对象(如果该对象尚不存在).
| 归档时间: |
|
| 查看次数: |
2294 次 |
| 最近记录: |