2017-03-15 16 views
1

を隠すために照会ネストされた配列私は、次の形式のjsonbデータを持っている、Postgresのjsonb、特定のフィールド

{ 
    "outerArray": [ 
    { 
     "price": { 
     "amount": 108.95, 
     "currencyCode": "GBP" 
     }, 
     "innerArray": [ 
     { 
      "details": { 
      "field1": "val1", 
      "field2": "val2", 
      "field3": "val3" 
      }, 
      "otherDetail": { 
      "date": "2016-07-23", 
      "time": "19:43:00" 
      }, 
      "innerMostArray": [ 
      { 
       "A1": "A1" 
      }, 
      { 
       "B1": "B1" 
      } 
      ] 
     } 
     ], 
     "someField": "values" 
    }, 
    { 
     "price": { 
     "amount": 108.95, 
     "currencyCode": "GBP" 
     }, 
     "innerArray": [ 
     { 
      "details": { 
      "field1": "val1", 
      "field2": "val2", 
      "field3": "val3" 
      }, 
      "otherDetail": { 
      "date": "2016-07-23", 
      "time": "19:43:00" 
      }, 
      "innerMostArray": [ 
      { 
       "A1": "A1" 
      }, 
      { 
       "B1": "B1" 
      } 
      ] 
     } 
     ], 
     "someField": "values" 
    } 
    ] 
} 

私は同じJSON構造を維持するが、フィールドを非表示にするには、この上で検索クエリを書きたいです"価格"、 "詳細" には、 "otherDetail" と "someField"

検索結果がこの

{ 
    "outerArray": [ 
    { 
     "innerArray": [ 
     { 
      "innerMostArray": [ 
      { 
       "A1": "A1" 
      }, 
      { 
       "B1": "B1" 
      } 
      ] 
     } 
     ] 
    }, 
    { 
     "innerArray": [ 
     { 
      "innerMostArray": [ 
      { 
       "A1": "A1" 
      }, 
      { 
       "B1": "B1" 
      } 
      ] 
     } 
     ] 
    } 
    ] 
} 

のようになりますが、これは行うことができますか?

+0

はい、それは行うことができます。あなたはこれまでどんな質問をしていますか? –

+0

私はjsonbとpostgresを初めて使用しています。私の実際のシナリオでは、いくつかの他の入れ子があり、この現在のjsonに到達するためにjsonb_extract_path_textを使用しました。そして現在、私はポストバックからjsonデータ全体を取得しており、jackson jsonを使って私の側から隠れ/マッピングの部分をやっています。 – phx

+0

あなたが使っているPostresのバージョンによっては多かれ少なかれ快適ですが、*これは私の意見です* jsでjsonを操作する方がより快適です –

答えて

1

使用しているPostgreSQLのバージョンを必ず指定してください。下の例は、バージョンv9.5 +で正常に動作するはずです。

私はJSONBを構築することにより、この近づくだろうあなたはjsonb_build_object()jsonb_build_array()機能で必要なオブジェクト:

サンプルクエリ:

WITH test(data) AS (VALUES 
    ('{ 
     "outerArray": [ 
     { 
      "price": { 
      "amount": 108.95, 
      "currencyCode": "GBP" 
      }, 
      "innerArray": [ 
      { 
       "details": { 
       "field1": "val1", 
       "field2": "val2", 
       "field3": "val3" 
       }, 
       "otherDetail": { 
       "date": "2016-07-23", 
       "time": "19:43:00" 
       }, 
       "innerMostArray": [ 
       { 
        "A1": "A1" 
       }, 
       { 
        "B1": "B1" 
       } 
       ] 
      } 
     ], 
     "someField": "values" 
     }, 
    { 
     "price": { 
     "amount": 108.95, 
     "currencyCode": "GBP" 
     }, 
     "innerArray": [ 
     { 
      "details": { 
      "field1": "val1", 
      "field2": "val2", 
      "field3": "val3" 
      }, 
      "otherDetail": { 
      "date": "2016-07-23", 
      "time": "19:43:00" 
      }, 
      "innerMostArray": [ 
      { 
       "A1": "A1" 
      }, 
      { 
       "B1": "B1" 
      } 
      ] 
     } 
     ], 
     "someField": "values" 
    } 
    ]}'::JSONB) 
) 
SELECT 
    jsonb_build_object(
    'outerArray', 
    array_agg(
     jsonb_build_object(
      'innerArray', 
      json_build_array(
       json_build_object(
        'innerMostArray', 
        innerArray->'innerMostArray') 
      ) 
     ) 
    ) 
) as result 
FROM test t, 
    jsonb_array_elements(t.data->'outerArray') as outerElement, 
    jsonb_array_elements(outerElement->'innerArray') as innerArray; 

結果:

result                   
---------------------------------------------------------------------------------------------------------------------------------------------------------- 
{"outerArray": [{"innerArray": [{"innerMostArray": [{"A1": "A1"}, {"B1": "B1"}]}]}, {"innerArray": [{"innerMostArray": [{"A1": "A1"}, {"B1": "B1"}]}]}]} 
(1 row) 
+0

申し訳ありません。私は9.4.7を使用しています。 – phx

関連する問題