あなたがしてGINとインデックスができることを、キーの入力や配列としてJSONBドキュメントを取り、そして濾過キーで新しい文書を返す補助関数を使用して行うことができます。
create function jsonb_filter(doc jsonb, variadic keys text[])
returns jsonb
as 'select jsonb_object_agg(key, doc->key) from unnest(keys) key'
language sql
immutable;
create index filtered_index on jsonb_table
using gin (jsonb_filter(data, 'a', 'b'));
select data->'a'
from jsonb_table
where jsonb_filter(data, 'a', 'b') @> '{"a":1}';
あなたがしたいことクエリ内で繰り返されないように、関数内でフィルタリングするキーのセットをハードコーディングします。
あなただけのインデックスいくつかのキーの存在したい場合は、:
create function jsonb_keys(doc jsonb)
returns text[]
as 'select array_agg(key) from jsonb_object_keys(doc) key'
language sql
immutable;
create index keys_index on jsonb_table
using gin (jsonb_keys(data));
select data->'b'
FROM jsonb_table
where jsonb_keys(data) @> ARRAY['a'];
機能jsonb_keys
は、インデックスを作成するキーのみを含むように変更することができます。
ここに関連するSqlFiddleがありますhttp://sqlfiddle.com/#!17/b7935/6
さらに多くのデータをフィディルドに追加しますか?それで、yoiurインデックスを使用し始めますか?それ以外の場合はデモが動作しません:) –
@ VaoTsun有効なポイントですが、インデックスを適格にするためのキーは、クエリフィルタで_indexed式_を使用することです:) – Tair