在 PostgreSQL 中使用 JSONB 从数组中删除对象

Ben*_*ock 2 postgresql delete update json

我试图从我的数据库中删除一个元素。我要删除的元素位于一个名为 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

            },
}
Run Code Online (Sandbox Code Playgroud)

下面是我试图用来删除数组中的对象的查询

UPDATE site_content
SET content = jsonb_set(content, '{playersContainer,players}'::text[], content->'playersContainer'->'id'->'players' #- '{1}'::jsonb
Run Code Online (Sandbox Code Playgroud)

但是,这似乎删除了表中内容行中的所有数据,而不仅仅是我的玩家数组中 ID 为 1 的数组。

Rom*_*huk 5

删除键(警告 - 与纯 SQL 数组不同,json/jsonb 数组索引从 0 开始):

UPDATE site_content
   SET content #- '{playersContainer,players,0}'::text[];
Run Code Online (Sandbox Code Playgroud)

要删除具有特定 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[], '{}');
Run Code Online (Sandbox Code Playgroud)