2016-08-14 31 views
5

iç içe geçirilmiş bir diziye nasıl JSONB sütununa zorlamak için JSON nesnesini potansiyel olarak var olan JSON nesnelerini iç içe geçmiş bir diziye zorladım - aşağıdaki JSON snippet'inde "sayfalara" bakın. (Hala o anlamak zor biraz bulma rağmen)JSONB sütunu

{ 
    "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 
} 

Ben jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean]) farkında ama bunun kullanarak tahmin gerektirecektir ilk SELECT bütün JSONB kolonu, sırayla kaç unsurları öğrenmek için bu "sayfalar" içinde zaten var ve jsonb_set'u kullanmaya iten hangi dizin? Postgres 9.5/9.6'da programlama dillerinde bildiklerimizin eşdeğerini elde etmenin bir yolunu umuyoruz. pages.push({"key": "val"}).

Postgresql 9.5 veya 9.6 ile bunu yapmanın en iyi ve en kolay yolu ne olurdu?

cevap

6

jsonb_set() numaralı numara, jsonb nesnesinin bir bölümünü değiştirmesidir, ancak tüm nesneyi döndürür. Böylece, sütunun geçerli değerini ve değiştirmek istediğiniz yolu ("sayfalar" dize dizisi olarak) geçirirsiniz, sonra varolan diziyi (my_column->'pages') alır ve buna yeni nesneyi || eklersiniz. jsonb nesnesinin tüm diğer parçaları oldukları gibi kalır. Sütuna tamamen yeni bir nesne atarsınız, ancak bu bir alakasızdır çünkü bir UPDATE, fiziksel tabloya yine de yeni bir satır yazar. Zaten mevcut değilse true ayarlı

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

opsiyonel create_missing parametre burada "sayfalar" nesne ekler.

+0

Vay canına! Çok teşekkür ederim - aynı zamanda bunu daha ayrıntılı bir şekilde açıklamak için zaman ayırdınız, çünkü belgeleri okumayı başaramadım. :-) – Dac0d3r

+0

Yardım için sevindim, evet, dokümanlar bazen zor okunabilir, özellikle fonksiyonların tanımlandığı bu tablolar olabilir. Bunu daha fazla ayrıntıyla birlikte SO Belgeleri'ne koyacağım. – Patrick

+0

"Sayfalar" özelliğini ayarlamak için bir yol var mı? İlk önce ayrı bir güncelleme yapmak zorunda kalmadan mı? – Dac0d3r