postgres中的部分更新json字段

时间:2013-01-08 01:44:05

标签: json postgresql postgresql-9.2

Postgres我有一个这样的数据库:

CREATE TABLE storehouse
(
  user_id bigint NOT NULL,
  capacity integer NOT NULL,
  storehouse json NOT NULL,
  last_modified timestamp without time zone NOT NULL,
  CONSTRAINT storehouse_pkey PRIMARY KEY (user_id)
)

storehouse.storehouse正在存储如下数据:

{
    "slots":[
        {
            "slot" : 1,
            "id" : 938
        },
        {
            "slot" : 2,
            "id" : 127
        },
    ]
}

问题是,我想更新storehouse.storehouse.slots[2],但我不知道如何做到这一点,我知道如何改变整个storehouse.storehouse字段,但我想知道自{{ {1}}支持postgres类型,它应该支持部分修改,否则json类型和json类型之间没有区别。(我知道text类型也有类型验证与json

不同

2 个答案:

答案 0 :(得分:7)

目前不支持JSON索引和部分更新。 PostgreSQL 9.2中的JSON支持是基本的,仅限于验证JSON以及将行和数组转换为JSON。在内部,json确实只是text

正在进行部分更新,索引等增强功能。无论如何,当JSON值的一部分发生变化时,PostgreSQL将无法避免重写整行,因为这是MVCC模型固有的。并发性。实现这一目标的唯一方法是将JSON值拆分为多边元组中的多个元组,如TOAST表 - 这是可能的,但可能性能很差,而且目前还远未被考虑。

正如Chris Travers指出的那样,可以使用其他语言的PL / V8函数或函数,使用像Perl或Python这样的json支持来提取值,然后在这些函数上创建表达式索引。

答案 1 :(得分:0)

自PostgreSQL 9.5起,有一个名为jsonb_set的函数将其作为输入参数:

  • 一个JSON对象
  • 表示路径(键和子键)的数组
  • 要存储的新值(也是JSON对象)

示例:

 # SELECT jsonb_set('{"name": "James", "contact": {"phone": "01234 567890", "fax": "01987 543210"}}'::jsonb,
            '{contact,phone}',
            '"07900 112233"'::jsonb);
                                  jsonb_replace                                  
 --------------------------------------------------------------------------------
  {"name": "James", "contact": {"fax": "01987 543210", "phone": "07900 112233"}}
 (1 row)