web-dev-qa-db-fra.com

Supprimer un objet de l'intérieur d'un tableau à l'aide de JSONB dans PostgreSQL

Je tente de supprimer un élément de ma base de données. L'élément que je veux supprimer est dans un objet JSON appelé Plingercontainer qui contient un tableau nommé joué. Tout cela se trouve dans une table appelée site_content. J'essaie de supprimer l'objet en fonction de son identifiant.

Voici l'échantillon 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

            },
}

Ci-dessous la requête que je tente d'utiliser pour supprimer l'objet dans le tableau

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

Cependant, cela semble supprimer toutes les données de ma ligne de contenu dans ma table et non seulement la matrice avec un ID de 1 dans mon tableau de joueurs.

2
Ben Pocock

Pour supprimer la touche (AVERTISSEMENT - JSON/JSONB L'Index commence à partir de 0 contrairement aux tableaux SQL pure):

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

Pour supprimer l'élément de tableau avec ID spécifique:

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