我正在尝试将metadata
JSONB列用于多租户应用程序。每个租户的每个user
必须具有相同的metadata
,但租户的metadata
字段不同。
为了使每个租户保持所有用户元数据同步,当租户管理员修改元数据字段时,我需要确保所有用户都使用以下条件更新其元数据JSONB列:
例如,租户#1的所有用户都分配了以下元数据:{ "EmployeeNo" : 123, "HireDate" : "2012-10-10", "Age" : 43 }
以及管理员决定他们不关心年龄的某个地方,但他们确实想要开始跟踪ParkingSpace。 / p>
我需要新的元数据记录来保留EmployeeNo和HireDate值,删除Age键/值,并添加具有空值的ParkingSpace键。 { "EmployeeNo" : 123, "HireDate" : "2012-10-10", "ParkingSpace" : null }
。
我原以为我可以运行类似于以下内容的更新查询,它返回一个JSONB对象,如果键存在则选择值,如果不存在则返回null:
UPDATE users SET metadata = metadata[keys: 'EmployeeNo', 'HireDate', 'ParkingSpace'] WHERE tenant_id = 1;
显然这不起作用,但希望它能说明问题吗?
答案 0 :(得分:0)
更新:我可能误解了您的问题。也许你想要这样的东西:
UPDATE users
SET metadata = (SELECT json_object_agg(n,metadata->>n) FROM unnest(ARRAY['EmployeeNo','HireDate','ParkingSpace']) AS t(n))
此解决方案涉及通过仅从原始metadata
中提取所需字段来创建全新的jsonb对象。要复制的字段被指定为可以轻松自定义的数组。
原始回答:我认为应该这样做:
UPDATE users
SET metadata = (metadata - 'Age') || '{"ParkingSpace": null}'::jsonb;
我正在使用||
运算符将2个jsonb对象合并为一个,而-
运算符则删除键/值对。