【问题标题】:How to push a JSON object to a nested array in a JSONB column如何将 JSON 对象推送到 JSONB 列中的嵌套数组
【发布时间】:2016-12-20 20:36:56
【问题描述】:

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

{
    "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 执行此操作的最佳和最简单的方法是什么?

【问题讨论】:

    标签: postgresql jsonb postgresql-9.5


    【解决方案1】:

    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);
    

    此处可选的create_missing 参数设置为true,如果“pages”对象不存在,则添加它。

    【讨论】:

    • 哇它好用!非常感谢 - 你花时间更详细地解释它也很棒,因为我无法通过阅读文档来弄清楚。 :-)
    • 很高兴能提供帮助,是的,有时文档可能很难阅读,尤其是这些描述功能的表格。我会在 SO 文档中详细说明这一点。
    • 如果“pages”属性不存在,有没有办法设置它?无需先进行单独更新?
    • jsonb_set() 有一个可选的create_missing 参数供您使用。只需在函数调用中添加, true;查看更新的答案。
    • 您好,帕特里克。谢谢,但我无法让它工作。不过这并不重要,因为我可以这样做:select coalesce(data, '{}'::jsonb ) || '{"pages": [{"url":"test"}]}'::jsonb from my_table 但它会非常酷,如果它有效:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多