web-dev-qa-db-ja.com

動的キーを持つJSONフィールドのインデックス

私はPG 9.5を使用しており、Visitors(id、data :: json)テーブルを持っています

例:

Visitor(id: 1, data: {name: 'Jack', age: 33, is_user: true })

次のようなクエリを実行したい

  • Jack and age> 25という名前のすべての訪問者を提供してください
  • ユーザーであるが名前が指定されていないすべての訪問者を私に教えてください(jsonにないキー)

ユーザーが指定したデータ列内のキーは動的です。

この状況で最も意味のあるインデックスはどれですか。

4
Mads

JSON列をjsonbに変更し、次のようにデータフィールドでジンインデックスを試します。

create index ginner on Visitor using gin(data);

それらは作成が遅く、大きくなる可能性がありますが、任意のクエリを許可します。ここにデモがあります:

https://blog.codeship.com/unleash-the-power-of-storing-json-in-postgres/

2
CalZ

最初のクエリにこれを試してください

create index IX_1 on Visitor using BTree((data->>'age')::INT)

そして、これは2番目のクエリ用です

create index IX_2 on Visitor using BTree((data->>'is_user')::INT, (data->>'Name'))

Jack and age> 25という名前のすべての訪問者を提供してください

ユーザーであるが名前が指定されていないすべての訪問者を私に教えてください(jsonにないキー)

あなたはドキュメントを読んだと思います。答えは、これを行うことはできないということです。 GistGINを使用してJSONBで機能するインデックスクラスには、jsonb_path_opsjsonb_ops(デフォルト)の2種類があります。

CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);
CREATE INDEX idxgin ON api USING GIN (jdoc);

jsonb_opsの使用値が存在しないことをテストできると思います。ただし、これらのどちらでも、任意のcontainment以外はテストできません。 JSONBインデックスに関するドキュメントから

JsonbのデフォルトのGIN演算子クラスは、最上位のキー存在演算子?、?&および?|を使用したクエリをサポートしています。演算子とパス/値が存在する演算子@>。

JSON-function docs で、これらの演算子がタイプに対して何をするかを確認してください

ジャックが25歳以上かどうかを知る必要がある場合。data->>'age'にbtreeを作成する必要があります

0
Evan Carroll