2017-03-29 5 views
1

私はここで指定されたフォームでPostrgresのカラムの中のユーザファクトを更新しようとしています。更新jsonbカラム

jsonb現在、データの列に、更新されるのを待っている:デシベルまで送られる

data = { "type1" : ["value1", "value2"], "type2" : ["value3"], "type3" : ["value4"] }

はjsonb:それは更新後jsonbがどのように見えるべきか

new_jsonb = { "type1" : ["value7", "value8"], "type3" : ["value6"]}

updated_jsonb = { "type1: ["value7", "value8"], "type2": ["value3"], "type3": ["value6"] }

基本的なルールを我々がそれを更新したいものと、データセット内の元々値を比較します:

  1. まで渡されていますnew_jsonbは現在dataにないキーが含まれている場合jsonbの場合、それらのキーに値が追加されます。

  2. この場合、new_jsonbには現在のdata jsonbに含まれるキーが含まれていますが、これらのキーはすべて古いキーを置き換えます。

Thisポストはjsonb_set機能のための一般的な使用を概説役に立つ仕事をしてくれたが、私はトラブルを通過すると、配列内の比較を行うことを抱えています。具体的にはpathパラメータを指定します。

基本的に私が立ち往生しているところは、これが起こるためにどのようなパスを指定するのか分からないということです。私が持っているものはUPDATE table_name SET data = jsonb_set(data {don't know what path should be}, new) WHERE customer_id = $customerIdです。渡されたnew_jsonbは、必ずしも同じ順序でキーと値のペアを通過するとは限りません。

+0

[PostgreSQLのアンチパターン:不要JSON/hstoreの動的な列(https://blog.2ndquadrant.com/postgresql-anti-patterns -unnecessary-jsonhstore-dynamic-columns /) – Abelisto

答えて

2

使用the concatenate operator:

UPDATE table_name 
SET data = data || $newData 
WHERE customer_id = $customerId; 

例:

SELECT 
    '{ "type1": ["value1", "value2"], "type2": ["value3"], "type3": ["value4"] }'::jsonb || 
    '{ "type1": ["value7", "value8"], "type3": ["value6"]}'::jsonb as result 

            result         
--------------------------------------------------------------------------- 
{"type1": ["value7", "value8"], "type2": ["value3"], "type3": ["value6"]} 
(1 row) 
関連する問題