mysql-编辑json对象数组中的json对象

1tuwyuhd  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(550)

表名 guilds 数据

  1. members = {
  2. 'look': [{
  3. id: '123',
  4. bot: false,
  5. username: 'Joe',
  6. }, {
  7. id: '456',
  8. bot: false,
  9. username: 'Jeff',
  10. }]
  11. };

“look”包含一堆json对象“members”是表“guilds”中一行的名称。我的目标是将id为“123”的用户名编辑为janett。
使用mysql 8.0和javascript(使用模块mysql,node.js)。
我试过了
我尝试获取members行,然后解析结果并将新值赋给相应的字段。结果发现,mysql没有任何函数可以像mongoose那样从那里更新它。

  1. connection.query(`SELECT members FROM guilds WHERE id='${_guild_id}'`, (err, result) => {
  2. let parse = JSON.parse(result[0].members);
  3. parse.look.forEach(element => {
  4. if (element.id === '123') {
  5. element.username = "some name"
  6. }
  7. });
  8. });
p8ekf7hl

p8ekf7hl1#

一种方法是使用 json_table ,然后重新生成对象(这要求您事先知道对象的复杂结构)。
首先,考虑以下几点 select 查询,用于分析、修改和重建对象:

  1. select json_object(
  2. 'look',
  3. json_arrayagg(
  4. json_object(
  5. 'id', j.id,
  6. 'bot', j.bot,
  7. 'username', case when j.id = 123 then 'Janett' else j.username end
  8. )
  9. )
  10. ) v
  11. from guilds g
  12. cross join json_table(
  13. g.members ->> '$.look',
  14. '$[*]'
  15. columns (
  16. id int path '$.id',
  17. bot boolean path '$.bot',
  18. username varchar(100) path '$.username'
  19. )
  20. ) j
  21. where id = 1

你可以把它变成一个 update 查询,如果这是您想要的:

  1. update guilds g
  2. inner join (
  3. select g.id, json_object(
  4. 'look',
  5. json_arrayagg(
  6. json_object(
  7. 'id', j.id,
  8. 'bot', j.bot,
  9. 'username', case when j.id = 123 then 'Janett' else j.username end
  10. )
  11. )
  12. ) new_members
  13. from guilds g
  14. cross join json_table(
  15. g.members ->> '$.look',
  16. '$[*]'
  17. columns (
  18. id int path '$.id',
  19. bot boolean path '$.bot',
  20. username varchar(100) path '$.username'
  21. )
  22. ) j
  23. where g.id = 1
  24. group by g.id
  25. ) x
  26. on g.id = x.id
  27. set g.members = x.new_members
展开查看全部

相关问题