4

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が、Postgres は型をサポートしているため、部分的な変更をサポートする必要があるのではないかと考えています。そうしないと、型と型jsonに違いはありません。( type には とは異なる type validation があることも知っています)jsontextjsontext

4

2 に答える 2

7

JSON インデックス作成と部分更新は現在サポートされていません。PostgreSQL 9.2 での JSON サポートは基本的なものであり、JSON の検証と、行と配列の JSON への変換に限定されています。内部的にjsonは、実際にはほとんどtext.

部分的な更新、インデックス作成などの機能強化のための進行中の作業があります。しかし、PostgreSQL は、JSON 値の一部が変更されたときに行全体を書き換えることを避けることができません。これは同時実行の MVCC モデルに固有のものだからです。これを可能にする唯一の方法は、JSON 値を TOAST テーブルのように複数のタプルに分割してサイド リレーションにすることです。これは可能ですが、パフォーマンスが低下する可能性が高く、現時点では考慮されていません。

Chris Travers が指摘しているように、PL /V8 関数または Perl や Python などの JSON サポートを備えた他の言語の関数を使用して値を抽出し、それらの関数に式インデックスを作成できます。

于 2013-01-08T02:56:28.757 に答える