私はPG 9.5を使用しており、Visitors(id、data :: json)テーブルを持っています
例:
Visitor(id: 1, data: {name: 'Jack', age: 33, is_user: true })
次のようなクエリを実行したい
ユーザーが指定したデータ列内のキーは動的です。
この状況で最も意味のあるインデックスはどれですか。
JSON列をjsonbに変更し、次のようにデータフィールドでジンインデックスを試します。
create index ginner on Visitor using gin(data);
それらは作成が遅く、大きくなる可能性がありますが、任意のクエリを許可します。ここにデモがあります:
https://blog.codeship.com/unleash-the-power-of-storing-json-in-postgres/
最初のクエリにこれを試してください
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にないキー)
あなたはドキュメントを読んだと思います。答えは、これを行うことはできないということです。 Gist
とGIN
を使用してJSONBで機能するインデックスクラスには、jsonb_path_ops
とjsonb_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を作成する必要があります