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
  )
);