【问题标题】:Postgresql migrate data from jsonb array to jsonbPostgresql 将数据从 jsonb 数组迁移到 jsonb
【发布时间】:2021-09-01 07:25:36
【问题描述】:

假设我有一列包含这个 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'
        ))

任何帮助将不胜感激!提前致谢。

【问题讨论】:

    标签: postgresql jsonb


    【解决方案1】:

    data -> 'indicators' 是一个数组,您需要单独考虑其元素,然后再聚合回一个对象。为此,您可以分别使用jsonb_array_elementsjsonb_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 中钻取数组
    猜你喜欢
    • 2015-03-27
    • 1970-01-01
    • 2016-10-25
    • 2022-11-02
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多