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
键。所以它留给我src
和imageUrl
键。
要删除src
键,我运行以下查询
UPDATE
plans
SET
json = json::jsonb #- '{ photos, 0, src}'
;
在photos
数组中重复此操作多次,最终为我解决了这个问题。