【问题标题】:Postgres/jOOQ replace jsonb[] elementPostgres/jOOQ 替换 jsonb[] 元素
【发布时间】:2021-03-07 02:23:22
【问题描述】:

我有一个带有 jOOQ 和 Postgresql 数据库的 Spring 应用程序,该数据库有一个包含以下两列的表(问题):

id (Long)
documents (jsonb[]) <- array of jsonb (not jsonb array)

文档json结构如下:

{
   "id": (UUID),
   "name": (String),
   "owner"; (String)
}

我想要实现的是能够将具有匹配 id(通常只有一个)的文档替换为新文档。我正在为 jOOQ 甚至是普通的 SQL 苦苦挣扎。

我想我需要在 jOOQ 中编写一些简单的 SQL 才能做到这一点,但这没关系(至少)。我有一个想法来做以下事情:

  1. 取消嵌套文档列
  2. 过滤掉数组中需要更新的文档
  3. 附加应更新的文档
  4. 存储整个数组

原始 SQL 看起来像这样,但缺少要添加的新文档:

UPDATE issues SET documents = (SELECT ARRAY_AGG(doc) FROM issues, UNNEST(issues.documents) AS doc WHERE doc->>'id' != 'e4e3422f-83a4-493b-8bf9-37980d532538') WHERE issues.id = 1;

我的最终目标是在 jOOQ 中编写这个并附加要替换的文档。我正在使用 jOOQ 3.11.4。

【问题讨论】:

  • 在某种程度上可以标准化吗? IE。有create table documents (document_id uuid, issue_id bigint, document jsonb) 表吗?以这种方式管理数据似乎更容易......
  • 不幸的是,没有 - 对其余的应用程序和项目进度没有太大影响,但我同意你的看法......

标签: postgresql jooq


【解决方案1】:

你应该可以concatenate arrays in PostgreSQL:

UPDATE issues 
SET documents = (
  SELECT ARRAY_AGG(doc) || '{"id":"e4e3422f-83a4-493b-8bf9-37980d532538","name":"n"}'::jsonb
  FROM issues, UNNEST(issues.documents) AS doc 
  WHERE doc->>'id' != 'e4e3422f-83a4-493b-8bf9-37980d532538'
)
WHERE issues.id = 1

jOOQ 近期会加入一些常用的数组函数,例如: array concatenation,但我怀疑你现在可以用plain SQL templating 逃脱吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 2018-02-18
    • 2015-07-12
    • 2021-01-08
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多