如何在MySQL 5.7中更新嵌套的JSON数据类型

时间:2018-09-06 08:38:15

标签: mysql json mysql-5.7 mysql-json

使用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 :(得分:0)

您真的很困惑您的代码。尝试使用json_set或json_replace以及

之类的更新
... WHERE doc->"$.textures[*].types.t_1" = 0

您的代码很难阅读和理解,因为其中嵌入了许多功能

MySQL 8中不推荐使用BTW json_merge

您将要阅读https://elephantdolphin.blogspot.com/2018/09/json-paths-and-mysql-json-functions.html

答案 1 :(得分:0)

请参阅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 .:这可能是一个应用程序,如果使用传统的 标准化数据库。实际上,我还没有见过MySQL中的JSON例子,如果以传统方式设计表的话,这将不那么容易。