Postgresql 将数据从 jsonb 数组迁移到 jsonb
Postgresql migrate data from jsonb array to jsonb
假设我有一列包含此 jsonb 数据:
{
"indicators": [
{
"year": 2019,
"indicatorsByYear": [
{
"value": 3120,
"code": "Nb_h"
},
{
"value": 18,
"code": "S_ppa"
},
{
"value": 95,
"code": "T_occ"
}
]
},
{
"year": 2020,
"indicatorsByYear": [
{
"value": 300,
"code": "Nb_h"
},
{
"value": 18,
"code": "S_ppa"
},
{
"value": 55,
"code": "T_occ"
}
]
}
],
"dataProvidedByUser": false
}
我们的想法是将此列迁移到像这样的简化对象:
{
"indicatorsByYear": {
"2019": [
{
"value": 3120,
"code": "Nb_h"
},
{
"value": 18,
"code": "S_ppa"
},
{
"value": 95,
"code": "T_occ"
}
],
"2020": [
{
"value": 300,
"code": "Nb_h"
},
{
"value": 18,
"code": "S_ppa"
},
{
"value": 55,
"code": "T_occ"
}
]
},
"dataProvidedByUser": false
}
如何将 indicators
数组转换为以年份为键、以 indicatorsByYear
为值的映射对象。
关于信息,我可以拥有的最大年数是 11 年(从 2010 年到 2020 年),有些列有所有年份,有些只有一些。
我尝试过类似的东西但没有成功
update site
SET data = data
|| jsonb_build_object('indicatorsByYear',
jsonb_build_object(
data -> 'indicators' ->> 'year',
data -> 'indicators' ->> 'indicatorsByYear'
))
非常感谢任何帮助!提前致谢。
data -> 'indicators'
是一个数组,您需要单独考虑其元素,然后将其聚合回一个对象。您可以为此分别使用jsonb_array_elements
and jsonb_object_agg
。
此外,您需要从 data
列中删除旧的 indicators
键。
UPDATE site
SET data = jsonb_set(
data - 'indicators',
'{indicatorsByYear}',
(
SELECT jsonb_object_agg(el ->> 'year', el -> 'indicatorsByYear')
FROM jsonb_array_elements(data -> 'indicators') el
)
);
假设我有一列包含此 jsonb 数据:
{
"indicators": [
{
"year": 2019,
"indicatorsByYear": [
{
"value": 3120,
"code": "Nb_h"
},
{
"value": 18,
"code": "S_ppa"
},
{
"value": 95,
"code": "T_occ"
}
]
},
{
"year": 2020,
"indicatorsByYear": [
{
"value": 300,
"code": "Nb_h"
},
{
"value": 18,
"code": "S_ppa"
},
{
"value": 55,
"code": "T_occ"
}
]
}
],
"dataProvidedByUser": false
}
我们的想法是将此列迁移到像这样的简化对象:
{
"indicatorsByYear": {
"2019": [
{
"value": 3120,
"code": "Nb_h"
},
{
"value": 18,
"code": "S_ppa"
},
{
"value": 95,
"code": "T_occ"
}
],
"2020": [
{
"value": 300,
"code": "Nb_h"
},
{
"value": 18,
"code": "S_ppa"
},
{
"value": 55,
"code": "T_occ"
}
]
},
"dataProvidedByUser": false
}
如何将 indicators
数组转换为以年份为键、以 indicatorsByYear
为值的映射对象。
关于信息,我可以拥有的最大年数是 11 年(从 2010 年到 2020 年),有些列有所有年份,有些只有一些。
我尝试过类似的东西但没有成功
update site
SET data = data
|| jsonb_build_object('indicatorsByYear',
jsonb_build_object(
data -> 'indicators' ->> 'year',
data -> 'indicators' ->> 'indicatorsByYear'
))
非常感谢任何帮助!提前致谢。
data -> 'indicators'
是一个数组,您需要单独考虑其元素,然后将其聚合回一个对象。您可以为此分别使用jsonb_array_elements
and jsonb_object_agg
。
此外,您需要从 data
列中删除旧的 indicators
键。
UPDATE site
SET data = jsonb_set(
data - 'indicators',
'{indicatorsByYear}',
(
SELECT jsonb_object_agg(el ->> 'year', el -> 'indicatorsByYear')
FROM jsonb_array_elements(data -> 'indicators') el
)
);