如何将 JSON 对象推送到 JSONB 列中的嵌套数组

2023-11-26

我需要以某种方式将 JSON 对象推送到可能存在的 JSON 对象的嵌套数组 - 请参阅下面的 JSON 片段中的“页面”。

{
    "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 列,以便找出“pages”内已经存在多少元素以及使用哪个索引将其推送到jsonb_set, 正确的?我希望 Postgres 9.5 / 9.6 中有一种方法可以实现我们在编程语言中所知道的等效功能,例如。pages.push({"key": "val"}).

使用 Postgresql 9.5 或 9.6 执行此操作的最佳和最简单的方法是什么?


诀窍是jsonb_set()是它修改了a的一部分jsonb对象,但它返回整个对象。因此,您将列的当前值和要修改的路径(此处为“pages”,作为字符串数组)传递给它,然后获取现有数组(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”对象尚不存在,则在此处添加它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 JSON 对象推送到 JSONB 列中的嵌套数组 的相关文章

随机推荐