mysql 5.7中如何更新嵌套json数据类型

mv1qrgav  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(650)

使用json\u set更新简单的json数据类型没有问题,但是使用nested就不起作用了。
查询的格式如下:

{  
   "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\u 1以将值从0更改为1

qqrboqgw

qqrboqgw1#

你真的在收集你的代码。尝试用json\u set或json\u replace之类的更新

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

你的代码是有点难以阅读和理解与许多功能嵌入在一起
在mysql 8中不推荐使用btw json\u merge
你会想读书的https://elephantdolphin.blogspot.com/2018/09/json-paths-and-mysql-json-functions.html

bq8i3lrv

bq8i3lrv2#

参考json\u 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、 美国:这可能是一个应用程序,最好使用传统的规范化数据库。实际上,我还没有在mysql中看到任何json的例子,如果表是以传统的方式设计的话,那么这些例子就不会更容易了。

相关问题