Добавить элемент JSON в массив с помощью postgres 9.4

Я пытаюсь добавить элемент JSON к уже существующему массиву в моей базе данных. Я знаю о jsonb_set, однако не могу перейти на Postgres 9.4, так как это отличный проект, а последняя версия postgresql для Maven — 9.4.

В настоящее время у меня есть структура json, подобная этой:

"playersContainer": {
        "players": [
            {
                "id": "1",
                "name": "Nick Pocock",
                "teamName": "Shire Soldiers",
                "bio" : "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla imperdiet lorem tellus, in bibendum sem dignissim sed. Etiam eu elit sit amet lacus accumsan blandit sed ut dolor. Mauris vel dui non nisi vestibulum commodo vel id magna. Donec egestas magna in tincidunt mollis. Fusce mauris arcu, rhoncus ut lacus sed, fermentum ultrices elit. In sollicitudin at ex dapibus vestibulum. Pellentesque congue, est id lobortis viverra, mauris lectus pharetra orci, ut suscipit nisl purus vehicula est. Aliquam suscipit non velit vel feugiat. Quisque nec dictum augue.",
                "ratings": [
                    1,
                    5,
                    6,
                    9
                ],
                "assists": 17,
                "manOfTheMatches": 20,
                "cleanSheets": 1,
                "data": [
                    3,
                    2,
                    3,
                    5,
                    6
                ],
                "totalGoals": 19

            }
}

Я хочу добавить новых игроков в массив игроков и обновить свою базу данных, я пытался выполнить обновление, но оно стерло остальные данные. Есть ли способ настроить таргетинг на массив игроков и добавить к нему новый объект json?


person Nick Pocock    schedule 06.02.2017    source источник
comment
Возможный дубликат Добавление (заталкивание) и удаление из массива JSON в PostgreSQL 9.2, 9.3 и 9.4?   -  person Evan Carroll    schedule 04.04.2017
comment
Возможный дубликат добавления объекта json к массиву в моей таблице postgres   -  person Thomas Hunter II    schedule 11.08.2017


Ответы (1)


К сожалению, в 9.4 нет функции json_set. Вы можете использовать что-то вроде этого:

WITH old_players AS (
       SELECT $1 AS j
  ), new_player AS (
       SELECT $2 AS j
  ), all_players AS (
       SELECT json_array_elements(j->'playersContainer'->'players') AS p
         FROM old_players
        UNION ALL
       SELECT *
         FROM new_player
  )      SELECT ('{"playersContainer": {"players": ' || json_agg(p) || '}}')::json
    FROM all_players
;

Вы можете использовать его как функцию:

CREATE OR REPLACE FUNCTION add_player(old_player json, new_player json) RETURNS json AS $$
WITH all_players AS (
       SELECT json_array_elements(($1)->'playersContainer'->'players') AS p
        UNION ALL
       SELECT $2
  ) 
  SELECT ('{"playersContainer": {"players": ' || json_agg(p) || '}}')::json
    FROM all_players
$$ LANGUAGE sql IMMUTABLE;

И после этого вы можете просто вызвать его:

UPDATE site_content SET content = add_player(content, '{"id": "2",  "name": "Someone Else"}') where id = :id;
person Roman Tkachuk    schedule 06.02.2017
comment
Я пытаюсь использовать array_append, но мне не повезло, я получаю сообщение об ошибке, говорящее, что его не существует, хотя я использую 9.4. Я пытаюсь получить массив своих игроков, используя нотацию ->, а затем добавляю свой новый JSON, например этот sql.executeUpdate( ОБНОВЛЕНИЕ site_content SET content = array_append(content-›'playersContainer'-›'players', '${json}'); где id = :id , id: player.teamId) - person Nick Pocock; 06.02.2017
comment
array_append не является функцией json (postgresql.org/docs/9.5/static/ функции-json.html) - person Roman Tkachuk; 06.02.2017
comment
comment
В 9.4 тоже нет json_agg. - person Evan Carroll; 04.04.2017