1

使用 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

4

2 回答 2

1

你真的在混淆你的代码。尝试使用 json_set 或 json_replace 等进行更新

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

您的代码有点难以阅读和理解,其中嵌入了许多功能

BTW json_merge 在 MySQL 8 中已弃用

你会想阅读https://elephantdolphin.blogspot.com/2018/09/json-paths-and-mysql-json-functions.html

于 2018-09-06T14:46:26.733 回答
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;

PS:这可能是一个使用传统规范化数据库会更好的应用程序。实际上,我还没有看到 MySQL 中的任何 JSON 示例,如果这些表是以传统方式设计的,那将不会更容易。

于 2018-09-06T21:26:32.980 回答