2017-10-12 9 views
0

PG jsonbフィールドの新機能です。 私は、例えば、以下のPostgresql jsonb traversal

{ 
"RootModule": { 
    "path": [ 
    1 
    ], 
    "tags": { 
    "ModuleBase1": { 
     "value": 40640, 
     "humanstring": "40640" 
    }, 
    "ModuleBase2": { 
    "value": 40200, 
    "humanstring": "40200" 
    } 
    }, 
"children": { 
    "RtuInfoModule": { 
    "path": [ 
     1, 
     0 
    ], 
    "tags": { 
     "in0": { 
     "value": 11172, 
     "humanstring": "11172" 
     }, 
     "in1": { 
     "value": 25913, 
     "humanstring": "25913" 
     } 
etc.... 

を含むjsonbフィールドが深いXレベルを照会し、特定のキーのための「タグ」キーを検索する方法はあり持っています。

「ModuleBase2」と「in1」が必要なので、値を取得しますか?

基本的には、キーを見つけて構造を知らずに値を返すまで、jsonbフィールドをトラバースするクエリを探しています。

PythonまたはJSでは、単純なループまたは再帰関数は、キーを見つけるまでjsonオブジェクト(または辞書)を簡単に走査できます。

PGに組み込まれている機能はありますか?

最終的に私はdjangoでこれをしたいと思います。

編集: 私は

SELECT data.key AS key, data.value as value 
FROM trending_snapshot, jsonb_each(trending_snapshot.snapshot- 
>'RootModule') AS data 
WHERE key = 'tags'; 

のようなものを行うことができます参照してくださいしかし、私はレベルを指定する必要があります。

答えて

0

あなたは(where句で条件を追加)、特定のキーの値を検索するクエリを変更this answer.を参照して、ネストされたjsonbを平らにするために再帰クエリを使用することができます。

with recursive flat (id, path, value) as (
    select id, key, value 
    from my_table, 
    jsonb_each(data) 
union 
    select f.id, concat(f.path, '.', j.key), j.value 
    from flat f, 
    jsonb_each(f.value) j 
    where jsonb_typeof(f.value) = 'object' 
) 
select id, path, value 
from flat 
where path like any(array['%ModuleBase2.value', '%in1.value']); 

id |      path      | value 
----+--------------------------------------------------+------- 
    1 | RootModule.tags.ModuleBase2.value    | 40200 
    1 | RootModule.children.RtuInfoModule.tags.in1.value | 25913 
(2 rows)  

テストをSqlFiddle.

+0

にああすごい。それは本当にクールです。どうもありがとうございます。再帰的なSQLのアイデアは、今も私には新しいものです。よく働く。そして、where句を編集することで、さまざまな目的の結果が簡単に生成できると思います。 –

+0

はい、条件を変更して結果を制御できます。 – klin

+0

あなたは命を救っています –

関連する問題