使用 Rails 中的 postgres json 字段更新嵌套键

use*_*452 2 postgresql json jsonb

我一直在尝试更新以下内容:

{"boxes": {"book": 2, "moving": 2}, "goods": {}}
Run Code Online (Sandbox Code Playgroud)

到 :

{"boxes": {"book_new": 2, "moving": 2}, "goods": {}}
Run Code Online (Sandbox Code Playgroud)

不使用正则表达式或在 ruby​​ 中执行此操作。但似乎有点棘手。我想添加新密钥然后删除旧密钥,我不熟悉语法,而且我在互联网上找不到太多东西。

我能够向数据添加新元素,但不能向嵌套框添加新元素!!像那样:

Update moves SET data = data::jsonb || '{"bookasas": 2}'   WHERE data ->> 'boxes' LIKE '%book%';
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏。

kli*_*lin 5

没有替换 json 键的功能,因此您应该删除旧对象并添加新对象:

update moves 
set data = jsonb_set(
    data::jsonb,
    array['boxes'],
    (data->'boxes')::jsonb - 'book' || jsonb_build_object('book_new', data->'boxes'->'book')
    )
where data ->> 'boxes' like '%book%'
returning *;

                         data                         
------------------------------------------------------
 {"boxes": {"moving": 2, "book_new": 2}, "goods": {}}
(1 row)
Run Code Online (Sandbox Code Playgroud)