【问题标题】:In Postgres - How to Remove an Element from JSONB Array (JSONB[]) by Identifier/value在 Postgres 中 - 如何通过标识符/值从 JSONB 数组 (JSONB[]) 中删除元素
【发布时间】:2021-09-20 22:06:22
【问题描述】:

在 Postgresql (13+) 中,users 表有一个 JSONB[] 列 (notifications) 包含用户通知。通知由一个简单的字典填充,产生以下数组:

[
  { 
    "notification_id": "c20da296", # abbreviating UUID4
    "level": "info",
    "timestamp": ...,
    "content": ...
  },

  .. more notifications ..
]

当用户关闭通知时,我想使用通知的 id 将其从数组中删除(同时保留其他通知)。许多资源展示了如何处理 JSONB 嵌套结构(例如,here)或跨多个用户(例如,here)。有没有办法实现这一点,也许以某种方式使用- 运算符?我期待以下内容:

UPDATE users SET notifications - `{"notification_id": "c20da296"}` 
WHERE user_id = "<user_uuid4>";

注意:用户的标识符是已知的,不需要遍历所有用户来选择相关的notification_id。

【问题讨论】:

  • 之前好像有人问过类似的问题。他们说他们能够弄清楚如何只为一排做这件事,并且需要帮助为多排做这件事。接受的答案包括一个示例,显示它为一行或多行完成:stackoverflow.com/questions/40285583/…
  • @Matt,请参阅原始帖子 - 在您链接到该列的问题中,该列是结构化的(“名称”、“类型”、“属性”),位于属性列下。我的专栏是一个数组,而不是字典。

标签: postgresql psycopg2 jsonb


【解决方案1】:

使用jsonb_path_query_array 函数和路径中的“不等于”条件。
它返回指定 JSON 值的 JSON 路径返回的所有 JSON 项,作为 JSON 数组

这是一个例子

UPDATE users 
SET notifications = jsonb_path_query_array(notifications, '$ ? (@.notification_id != "<notification_id_for_removal>")')
WHERE user_id = "<user_uuid4>";

【讨论】:

    猜你喜欢
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 2021-11-24
    • 2021-01-08
    • 2022-05-25
    • 2019-09-03
    相关资源
    最近更新 更多