Postgresql -重命名JSON列数组中所有对象的键



PostgreSQL 13

目标是将photos数组中的所有src键重命名为image

我有一个表plans,其中有一个列json,其结构与下面的示例类似。

{
"id": "some id",
"name": "some name",
"tags": [
{
"keyId": 123,
"valueId": 123
},
{
"keyId": 123,
"valueId": 123
}
],
"score": 123,
"photos": [
{
"src": "someString"
},
{
"src": "someString"
}
],
"payment": true
}

photos数组中的对象数量各不相同,但通常少于10个,因此使用非迭代方法也可以。

我试过这样做,但它只适合修改键的值,而不是键本身的名称。

UPDATE
plans
SET
json = jsonb_set(json::jsonb, '{photos, 0, src}', '"image"')
;

通过下面的尝试,我实际上能够重命名键,但它覆盖了其他所有内容,所以只剩下一个具有{"image": "someUrl"}的对象:

UPDATE
plans
SET
json = (json -> 'photos' ->> 0)::jsonb - 'src' || jsonb_build_object ('image',
json::jsonb -> 'photos' -> 0 -> 'src')
WHERE json::jsonb ? 'photos' = true;

是否有按预期重命名键的方法?

所以最后我使用了最初的jsonb_set方法的变体。该解决方案既不优雅也不高效,但由于它是一次性操作,因此只需要工作:

UPDATE
plans
SET
json = jsonb_set(json::jsonb, '{photos, 0, imageUrl}', (json->'photos'->0->'src')::jsonb)
WHERE
json->'photos'->0->'src' IS NOT NULL
;

此查询将使用photos数组中第一个对象(位置0)的src键的现有值添加imageUrl键。所以它留给我srcimageUrl键。

要删除src键,我运行以下查询

UPDATE
plans
SET
json = json::jsonb #- '{ photos, 0, src}'
;

photos数组中重复此操作多次,最终为我解决了这个问题。

最新更新