2016-10-14 4 views
1

私はpostgres 9.5.4を使用しています。Postgres:入れ子になったjsonb列の範囲照会

jsonb列に格納されたサンプルのJSONデータの下から、私は、これは、1つのユーザのレコードのサンプルですo['mid'] > 7000

に一致するレコードを検索したいと思います。そのようなユーザーは何百万人もいるでしょう。

{ 
    "uid": 14105529, 
    "o": [ 
    { 
     "mid": 6551, 
     "ac": 1913, 
     "ip": "144.36.233.44", 
     "adw": 5, 
     "at": 133000, 
     "ad": 151015, 
     "aid": 0 
    }, 
    { 
     "mid": 7552, 
     "ac": 1913, 
     "ip": "144.36.233.44", 
     "adw": 5, 
     "at": 133000, 
     "ad": 151015, 
     "aid": 0 
    }, 
    { 
     "mid": 7553, 
     "ac": 1913, 
     "ip": "144.36.233.44", 
     "adw": 5, 
     "at": 133000, 
     "ad": 151015, 
     "aid": 0 
    } 
    ] 
} 

答えて

2
with a_table(jdata) as ( 
values (
    '{ 
     "uid":14105529, 
     "o":[ 
      {"mid":6551,"ac":1913,"ip":"144.36.233.44","adw":5,"at":133000,"ad":151015,"aid":0}, 
      {"mid":7552,"ac":1913,"ip":"144.36.233.44","adw":5,"at":133000,"ad":151015,"aid":0}, 
      {"mid":7553,"ac":1913,"ip":"144.36.233.44","adw":5,"at":133000,"ad":151015,"aid":0} 
     ] }'::jsonb 
    ) 
) 

select jdata->'uid' as uid, value 
from a_table, jsonb_array_elements(jdata->'o') 
where (value->>'mid')::int > 7000; 

    uid |            value            
----------+-------------------------------------------------------------------------------------------------- 
14105529 | {"ac": 1913, "ad": 151015, "at": 133000, "ip": "144.36.233.44", "adw": 5, "aid": 0, "mid": 7552} 
14105529 | {"ac": 1913, "ad": 151015, "at": 133000, "ip": "144.36.233.44", "adw": 5, "aid": 0, "mid": 7553} 
(2 rows) 

クエリがあるためjsonb_array_elements()でJSON配列をネスト解除の必要性大規模データセットの本当に高価になるだろう。 速度を上げるために使用できるインデックスはありません。

+0

ありがとうKlin。これは私のために働く。あなたが述べたように、大規模なデータセットのパフォーマンスをチェックする必要があります。 – Carbonrock

+0

@ klin、citusクラスタでこのクエリを実行中に問題が発生しました。助けが必要。 postgres =#jsontest、jsonb_array_elements(data - > 'o')からcount(1)を選択します。ここで(value - >> 'mid'):: int> 7000; エラー:このクエリで分散計画を実行できません 詳細:複雑なテーブル式は現在サポートされていません – Carbonrock

+0

残念ながら、これは標準のPostgresエラーメッセージではありません。シータスにはさらなる制限があるようですが、[このシータス問題](https://github.com/citusdata/citus/issues/521)を参照してください。 – klin

関連する問題