如何在 Postgres 中转换嵌套在另一个数组内的对象内的 JSON 数组?

How to transform a JSON array nested inside an object inside another array in Postgres?

我正在使用 Postgres 9.6 并且有一个名为 credits 的 JSON 字段,其结构如下;一份名单,每个名单都有一个职位和可以担任该职位的多人。

[
  {
    "position": "Set Designers",
    people: [
      "Joe Blow",
      "Tom Thumb"
    ]
  }
]

我需要将嵌套的 people 数组(目前只是表示其名称的字符串)转换为具有 nameimage_url 字段的对象,如下所示

[
  {
    "position": "Set Designers",
    people: [
      { "name": "Joe Blow", "image_url": "" },
      { "name": "Tom Thumb", "image_url": "" }
    ]
  }
]

到目前为止,我只能找到在父 JSON 数组或嵌套在单个 JSON 对象中的数组字段上执行此操作的合适示例。

到目前为止,这是我能够管理的所有内容,甚至它正在破坏结果。

UPDATE campaigns
  SET credits = (
    SELECT jsonb_build_array(el)
    FROM jsonb_array_elements(credits::jsonb) AS el
  )::jsonb
;

创建一个辅助函数来简化相当复杂的操作:

create or replace function transform_my_array(arr jsonb)
returns jsonb language sql as $$
    select case when coalesce(arr, '[]') = '[]' then '[]'
    else jsonb_agg(jsonb_build_object('name', value, 'image_url', '')) end
    from jsonb_array_elements(arr)  
$$;

有了这个功能,更新就没那么可怕了:

update campaigns
  set credits = (
    select jsonb_agg(jsonb_set(el, '{people}', transform_my_array(el->'people')))
    from jsonb_array_elements(credits::jsonb) as el
  )::jsonb
;

Working example in rextester.