2017-03-29 4 views
1

J'essaie de mettre à jour les faits utilisateur à l'intérieur d'une colonne dans un db Postrgres sous la forme indiquée ici.Mise à jour de la colonne jsonb

jsonb actuellement dans la colonne de données et en attente d'être mis à jour:

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

jsonb qui est envoyé à db:

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

comment le jsonb doit prendre soin à jour:

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

Les règles de base lorsque l'on compare la valeur à l'origine dans l'ensemble de données, avec celui que nous voulons mettre à jour avec sont:

  1. si le new_jsonb qui est en cours laissé passer contient des clés qui ne sont pas dans le data courant jsonb, alors ces clés sont ajoutées avec leurs valeurs. Si le new_jsonb en cours de transmission contient des clés qui se trouvent dans le data jsonb actuel, ces clés remplacent simplement les anciennes clés.

This poste a fait un travail utile décrivant l'utilisation générale de la fonction jsonb_set, mais je vais avoir du mal à passer à travers et faire la comparaison dans les tableaux. Spécifier spécifiquement le paramètre path.

Donc, fondamentalement, où je suis coincé, je ne sais pas quel chemin spécifier pour que cela se produise. Ce que j'ai est . Le new_jsonb qui est passé, ne passera pas toujours les paires clé-valeur dans le même ordre.

+0

[PostgreSQL anti-modèles: inutiles json/colonnes hstore dynamiques] (https://blog.2ndquadrant.com/postgresql-anti-patterns -unnecessary-jsonhstore-dynamic-columns /) – Abelisto

Répondre

2

utilisation the concatenate operator:

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

Exemple:

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)