web-dev-qa-db-ja.com

PostgreSQLのJSONBを使用して配列内からオブジェクトを削除する

データベースから要素を削除しようとしています。削除する要素は、playersという名前の配列を含むplayerContainerというJSONオブジェクト内にあります。これはすべて、site_contentというテーブル内にあります。 IDに基づいてオブジェクトを削除しようとしています。

ここにサンプルのJSONがあります

"playersContainer": {
        "players": [
            {
                "id": "1",
                "name": "Nick",
                "teamName": "Shire Soldiers",
                "ratings": [
                    1,
                    5,
                    6,
                    9
                ],
                "assists": 17,
                "manOfTheMatches": 20,
                "cleanSheets": 1,
                "data": [
                    3,
                    2,
                    3,
                    5,
                    6
                ],
                "totalGoals": 19

            },
}

以下は、配列内のオブジェクトを削除するために使用しようとしているクエリです

UPDATE site_content
SET content = jsonb_set(content, '{playersContainer,players}'::text[], content->'playersContainer'->'id'->'players' #- '{1}'::jsonb

ただし、これにより、players配列のIDが1の配列だけでなく、テーブルのコンテンツ行からすべてのデータが削除されるようです。

2
Ben Pocock

キーを削除するには(警告-純粋なSQL配列とは異なり、json/jsonb配列のインデックスは0から始まります):

UPDATE site_content
   SET content #- '{playersContainer,players,0}'::text[];

特定のIDを持つ配列要素を削除するには:

UPDATE site_content
   SET content = content #- coalesce(('{playersContainer,players,' || (
            SELECT i
              FROM generate_series(0, jsonb_array_length(content->'playersContainer'->'players') - 1) AS i
             WHERE (content->'playersContainer'->'players'->i->'id' = '"2"')
         ) || '}')::text[], '{}');
3
Roman Tkachuk