2016-08-14 44 views
5

Potrzebuję jakoś popchnąć obiekt JSON do zagnieżdżonej tablicy potencjalnie istniejących obiektów JSON - zobacz "strony" w poniższym fragmencie kodu JSON.Jak przesłać obiekt JSON do tablicy zagnieżdżonej w kolumnie JSONB

{ 
    "session_id": "someuuid", 
    "visitor_ui": 1, 
    "pages": [ 
     { 
      "datetime": "2016-08-13T19:45:40.259Z", 
      "duration,": 0, 
      "device_id": 1, 
      "url": { 
       "path": "/" 
      } 
     }, 
     { 
      "datetime": "2016-08-14T19:45:40.259Z", 
      "duration,": 0, 
      "device_id": 1, 
      "url": { 
       "path": "/test" 
      } 
     }, 
     // how can i push a new value (page) here?? 
    ] 
    "visit_page_count": 2 
} 

Jestem świadomy jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean]) (choć nadal ze znalezieniem go trochę trudny do zrozumienia), ale myślę, korzystając, że wymagałoby to ja pierwszy SELECT cała kolumna JSONB, aby dowiedzieć się, jak wiele elementów wewnątrz "stron" już istnieje i jakiego indeksu wypchnąć go do korzystania z jsonb_set, prawda? Mam nadzieję, że w PostgreSQL 9.5/9.6 można uzyskać odpowiednik tego, co znamy w językach programowania, np. pages.push({"key": "val"}).

Jaki byłby najlepszy i najprostszy sposób, aby to zrobić z PostgreSQL 9.5 lub 9.6?

Odpowiedz

6

Podstęp pod numer jsonb_set() polega na tym, że modyfikuje on część obiektu jsonb, ale zwraca cały obiekt. Podajemy więc bieżącą wartość kolumny i ścieżkę, którą chcemy zmodyfikować ("strony" tutaj, jako tablicę ciągów znaków), następnie pobieramy istniejącą tablicę (my_column->'pages') i dołączamy do niej nowy obiekt ||. Wszystkie pozostałe części obiektu jsonb pozostają niezmienione. W rzeczywistości przypisujesz zupełnie nowy obiekt do kolumny, ale to nie ma znaczenia, ponieważ i tak UPDATE zapisuje nowy wiersz do fizycznej tabeli.

UPDATE my_table 
SET my_column = jsonb_set(my_column, '{pages}', my_column->'pages' || new_json, true); 

Opcjonalny create_missing parametr ustawiony true tutaj dodaje obiekt „stron”, jeśli nie istnieje.

+0

Wow it works! Dziękuję bardzo - również świetnie poświęciłeś czas, aby wyjaśnić to bardziej szczegółowo, ponieważ nie byłem w stanie tego zrozumieć czytając dokumenty. :-) – Dac0d3r

+0

Cieszę się, że mogę pomóc i, tak, dokumenty mogą być trudne do odczytania, szczególnie te tabele, w których opisane są funkcje. Umieszczę to w Dokumentacji SO z większą ilością opracowań. – Patrick

+0

Czy istnieje sposób ustawienia właściwości "pages", jeśli NIE istnieje? Bez konieczności wcześniejszej osobnej aktualizacji? – Dac0d3r