Как обновить вложенный тип данных JSON в MySQL 5.7 - PullRequest
0 голосов
/ 06 сентября 2018

Использование JSON_SET У меня нет проблем с обновлением простого типа данных JSON, но с вложенным оно просто не работает.

Как должен выглядеть запрос в таком формате:

{  
   "textures":[  
      {  
         "label":"test",
         "types":{  
            "t_1":0,
            "t_2":0
         }
      },
      {  
         "label":"KEK",
         "types":{  
            "t_1":0,
            "t_2":0
         }
      }
   ],
   "weapons":[  
      {  
         "name":"WW_SHT",
         "ammo":0
      },
      {  
         "name":"WW_DSS",
         "ammo":0
      }
   ]
}

Некоторые строки могут быть пустыми, некоторые строки не будут иметь структуру «оружие».

Что я пробовал:

UPDATE `player`   SET `info` = COALESCE(
    JSON_MERGE(
      `info`,
      JSON_OBJECT('textures',
        JSON_OBJECT('types',
          JSON_OBJECT('t_1', '1', 't_2', '0')
        )
      )
    ),
    JSON_INSERT(
      JSON_OBJECT(),
      '$.textures',
       JSON_OBJECT('types',
         JSON_OBJECT('t_1', '1', 't_2', '0')
       )
    )
  );

Я хочу обновить t_1, чтобы изменить значение с 0 на 1

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

См. JSON_REPLACE ()

UPDATE player SET info = JSON_REPLACE(info, '$.textures[0].t_1', '1');

Однако, это только заменяет значение в 0-й текстуре. Если у вас есть несколько текстур, вы можете узнать, сколько текстур:

SELECT JSON_LENGTH(info, '$.textures') AS textures_count FROM player;

P.S .: Это, вероятно, приложение, которое было бы лучше, используя традиционные нормализованная база данных. На самом деле, я не видел ни одного примера JSON в MySQL, который был бы проще, если бы таблицы создавались традиционным способом.

0 голосов
/ 06 сентября 2018

Вы действительно запутываете свой код. Попробуйте обновить с помощью json_set или json_replace и что-то вроде

... WHERE doc->"$.textures[*].types.t_1" = 0

Ваш код немного сложен для чтения и понимания благодаря множеству встроенных функций

Кстати, json_merge устарела в MySQL 8

А вам захочется прочитать https://elephantdolphin.blogspot.com/2018/09/json-paths-and-mysql-json-functions.html

...