如何在不创建新对象的情况下在 jsonb 中添加新的键值对? (Postgres)

How to add a new key-value pair in jsonb without creating a new object? (Postgres)

我需要将新的键值对添加到现有的 json 对象中。将不胜感激。

json:

{
  "json_col": [
    {
      "val1": 1,
      "val2": 0,
      "val3": "qwe"
    }
  ]
}

我想到了这个查询

UPDATE table SET  
json_col = jsonb_set(
    json_col, 
    '{json_col}', json_col->'json_col' || '{"test":123}'))
where id=6400

它会输出:

{
  "json_col": [
    {
      "val1": 1,
      "val2": 0,
      "val3": "qwe"
    },
    {
      "test": 123
    }
  ]
}

但我需要这个 json 是一个单独的对象(没有额外的括号),像这样:

{
  "json_col": [
    {
      "val1": 1,
      "val2": 0,
      "val3": "qwe",
      "test": 123
    }
  ]
}

您的语法基本上是正确的,您只需更正 pathjsonb_set 提供的值并提取 json_col 元素的第一个元素:

UPDATE some_table SET  
  json_col = jsonb_set(
    json_col::jsonb, 
    '{json_col,0}', 
    (json_col->'json_col'->0)||'{"test":123}'
  )::json
where id=6400;

您可以在以下时间进行测试:db<>fiddle

数组中的多个元素

如果您的 json_col 数组包含多个元素,并且您想用相同的 key:value 对更新每个元素,您应该改用此查询:

UPDATE some_table SET  
  json_col = jsonb_set(
    json_col, 
    '{json_col}', 
    (SELECT jsonb_agg(elem||'{"test":123}') 
       FROM jsonb_array_elements( json_col->'json_col') AS elem ) 
  )
where id=6400;

db<>fiddle