如何将 JSON 对象推送到 JSONB 列中的嵌套数组
How to push a JSON object to a nested array in a JSONB column
我需要以某种方式将 JSON 对象推送到可能存在的 JSON 对象的嵌套数组中 - 请参阅下面 JSON 片段中的 "pages"。
{
"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
整个 JSON B列,为了找出"pages"里面有多少元素已经存在,用jsonb_set
推到什么索引,对不对?我希望在 Postgres 9.5 / 9.6 中有一种方法可以实现我们在编程语言中所知道的等价物,例如。 pages.push({"key": "val"})
.
使用 Postgresql 9.5 或 9.6 执行此操作的最佳和最简单方法是什么?
jsonb_set()
的诀窍在于它修改了 jsonb
对象的一部分,但 returns 修改了整个对象。因此,您将列的当前值和要修改的路径传递给它(此处为 "pages",作为字符串数组),然后获取现有数组 (my_column->'pages'
) 并附加 ||
的新对象。 jsonb
对象的所有其他部分保持原样。您实际上是在为该列分配一个全新的对象,但这无关紧要,因为 UPDATE
无论如何都会向物理 table 写入一个新行。
UPDATE my_table
SET my_column = jsonb_set(my_column, '{pages}', my_column->'pages' || new_json, true);
此处将可选的 create_missing
参数设置为 true
添加 "pages" 对象(如果尚不存在)。
我需要以某种方式将 JSON 对象推送到可能存在的 JSON 对象的嵌套数组中 - 请参阅下面 JSON 片段中的 "pages"。
{
"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
整个 JSON B列,为了找出"pages"里面有多少元素已经存在,用jsonb_set
推到什么索引,对不对?我希望在 Postgres 9.5 / 9.6 中有一种方法可以实现我们在编程语言中所知道的等价物,例如。 pages.push({"key": "val"})
.
使用 Postgresql 9.5 或 9.6 执行此操作的最佳和最简单方法是什么?
jsonb_set()
的诀窍在于它修改了 jsonb
对象的一部分,但 returns 修改了整个对象。因此,您将列的当前值和要修改的路径传递给它(此处为 "pages",作为字符串数组),然后获取现有数组 (my_column->'pages'
) 并附加 ||
的新对象。 jsonb
对象的所有其他部分保持原样。您实际上是在为该列分配一个全新的对象,但这无关紧要,因为 UPDATE
无论如何都会向物理 table 写入一个新行。
UPDATE my_table
SET my_column = jsonb_set(my_column, '{pages}', my_column->'pages' || new_json, true);
此处将可选的 create_missing
参数设置为 true
添加 "pages" 对象(如果尚不存在)。