2017-06-10 12 views
0

私はPostgres(Amazon RDSの9.6)でJSONデータ構造を照会しようとしています。データにはオブジェクトの配列が含まれ、オブジェクトの配列を含む要素があります。これらのネストされた配列のいずれかでキー+値と一致するすべてのレコードを検索したいと思います。このようなPostgresでネストされた配列を使用してJSONを効率的に照会する

考える行:

{"drinkers" : [ 
    {"name" : "geoff", 
    "beers" : [ 
    {"name": "PBR"}, 
    {"name" : "Bud Select"} 
    ]}, 
    {"name" : "tom", 
    "beers" : [ 
    {"name": "Bud Light"}, 
    {"name" : "Busch"} 
    ]} 
]} 

私は名前は、「PBR」であるのですdrinkers.beersオブジェクトがありますすべての行を検索します。私が来た最も近いがこれです:

select jsonb_data 
from bars 
where jsonb_array_elements(jsonb_array_elements(data -> 'drinkers') -> 'beers') ->> 'name' = 'PBR'`` 

しかし、ここではその代わりに一致する真/偽単一のリストを返しますので、これは動作しません。私は、サブクエリ、ラテラルジョインなどを使用して他のソリューションを考え出しましたが、これらのソリューションはすべて、適切なジンインデックスを使用してもパフォーマンスの問題があります。 Postgresでこのようなデータ構造をどのように問い合わせるかについての提案はありますか?

+0

[ArrayField内部ジャンゴJSONField]の可能な重複(https://stackoverflow.com/questions/41134260/django-:別のアプローチは、JSONB contain(すなわち@>)を使用することであろう

WHERE 'PBR' IN ( SELECT jsonb_array_elements(jsonb_array_elements(data -> 'drinkers') -> 'beers') ->> 'name' ); 

jsonfield-inside-arrayfield) – e4c5

答えて

1

IN演算子を試しましたか?

WHERE data -> 'drinkers' @> '[{"beers": [{"name": "PBR"}]}]'; 
0

申し訳ありませんが、これはおそらくコメントに過ぎませんが、名前を返すステートメントでリストまたは配列が得られる場合は、おそらく'PBR' = ANY jsonb_array_elements(...を使用できますか?

関連する問題