2016-08-14 66 views
5

我需要以某種方式將JSON對象推送到可能存在的JSON對象的嵌套數組 - 請參閱下面的JSON代碼片段中的「頁面」。如何將JSON對象推送到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 
} 

我知道了jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean])的(雖然仍然發現它有點很難理解),但我想利用這一點,就要求我第一SELECT整個JSONB列,以找出有多少元素裏面的「頁面」已經存在,以及使用什麼索引來使用jsonb_set,對吧?我希望在Postgres 9.5/9.6中能夠實現與我們在編程語言中所瞭解的相同的功能。 pages.push({"key": "val"})

用Postgresql 9.5或9.6做什麼是最好的和最簡單的方法?

回答

6

jsonb_set()的訣竅在於它修改了jsonb對象的一部分,但它返回整個對象。因此,您將列的當前值和要修改的路徑(此處爲「頁」,作爲字符串數組)傳遞給它,然後將現有數組(my_column->'pages')並將||新對象添加到該數組中。 jsonb對象的所有其他部分保持原樣。您正在有效地將一個全新的對象分配給列,但這是無關緊要的,因爲UPDATE無論如何都會向物理表寫入新行。如果它不存在

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

可選create_missing參數設置爲true這裏添加了「網頁」的對象。

+0

哇,它的工作原理!非常感謝你 - 同樣偉大的你花時間更詳細地解釋它,因爲我無法從閱讀文檔中找出它。 :-) – Dac0d3r

+0

很高興能夠提供幫助,而且,有時候,文檔有時可能會很難閱讀,特別是描述功能的這些表格。我將把它放在SO文檔中進行更詳細的說明。 – Patrick

+0

有沒有辦法設置「頁面」屬性,如果它不存在?無需首先進行單獨更新? – Dac0d3r