PostgreSQL JSONB中如何将单个contact对象转换为guardian数组?
将单个contact对象转换为guardian数组的实现方案
需求说明
原JSONB数据结构(单个联系人):
{ "studentId":"123", "contact":{ "name":"parent1", "address":"address1" } }
目标结构(多联系人数组):
{ "studentId":"123", "guardian":[ { "name":"parent1", "address":"address1" }, { "name":"parent2", "address":"address2" } ] }
1. PostgreSQL 中直接处理 JSONB 数据
如果是在PostgreSQL数据库中批量转换现有数据,可利用JSONB相关函数完成字段重构:
单条数据更新
UPDATE your_table_name SET data = jsonb_set( data - 'contact', -- 移除原contact字段 '{guardian}', -- 目标数组字段的路径 jsonb_build_array(data->'contact') -- 将原contact对象包装为数组 ) WHERE data->>'studentId' = '123'; -- 指定要更新的学生ID
批量更新所有符合条件的记录
如果要统一转换所有包含contact字段的记录:
UPDATE your_table_name SET data = jsonb_set( data - 'contact', '{guardian}', jsonb_build_array(data->'contact') ) WHERE data ? 'contact'; -- 仅更新存在contact字段的记录
2. 编程语言层面处理(以JavaScript为例)
如果是在业务代码中处理JSON对象,直接解构重构即可:
基础转换逻辑
// 原始学生数据 const originalStudent = { studentId: "123", contact: { name: "parent1", address: "address1" } }; // 转换为目标结构 const transformedStudent = { studentId: originalStudent.studentId, guardian: [originalStudent.contact] // 将单个contact转为数组 }; // 后续添加新联系人 transformedStudent.guardian.push({ name: "parent2", address: "address2" });
兼容无contact字段的场景
如果存在部分记录没有contact字段,可做兼容处理:
const transformedStudent = { studentId: originalStudent.studentId, guardian: originalStudent.contact ? [originalStudent.contact] : [] };
内容的提问来源于stack exchange,提问作者newbie
相关产品推荐
相关产品推荐

