首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MYSQL -编辑JSON对象数组中的json对象

MYSQL -编辑JSON对象数组中的json对象
EN

Stack Overflow用户
提问于 2020-05-25 20:53:03
回答 1查看 194关注 0票数 1

表名

guilds

数据

代码语言:javascript
运行
复制
members = {
    'look': [{
        id: '123',
        bot: false,
        username: 'Joe',
    }, {
        id: '456',
        bot: false,
        username: 'Jeff',
    }]
};

“查看”包含一组json对象。“会员”是表“行会”中一行的名称。我的目标是编辑id '123‘到Janett的用户名。

在JavaScript中使用MySQL8.0。(使用模块mysql、Node.js)。

我试过

我尝试获取成员行,然后解析结果并将新值赋给相应的字段。原来mysql并没有像猫鼬一样从那里更新它的任何功能。

代码语言:javascript
运行
复制
connection.query(`SELECT members FROM guilds WHERE id='${_guild_id}'`, (err, result) => {
   let parse = JSON.parse(result[0].members);
   parse.look.forEach(element => {
      if (element.id === '123') {
        element.username = "some name"
      }
   });
});
EN

回答 1

Stack Overflow用户

发布于 2020-05-25 21:32:00

一种选择是使用json_table将数组完全撤消为列和行,然后重新构建对象(这需要事先知道对象的复杂结构)。

首先,考虑以下select查询,该查询解析、修改和重新构建对象:

代码语言:javascript
运行
复制
select json_object(
    'look', 
    json_arrayagg(
        json_object(
            'id', j.id, 
            'bot', j.bot, 
            'username', case when j.id = 123 then 'Janett' else j.username end
        )
    )
) v
from guilds g
cross join json_table(
    g.members ->> '$.look',
    '$[*]'
    columns (
        id int path '$.id',
        bot boolean path '$.bot',
        username varchar(100) path '$.username'
    )
) j
where id = 1

然后,您可以将其转换为update查询,如果这是您想要的:

代码语言:javascript
运行
复制
update guilds g
inner join (
    select g.id, json_object(
        'look', 
        json_arrayagg(
            json_object(
                'id', j.id, 
                'bot', j.bot, 
                'username', case when j.id = 123 then 'Janett' else j.username end
            )
        )
    ) new_members
    from guilds g
    cross join json_table(
        g.members ->> '$.look',
        '$[*]'
        columns (
            id int path '$.id',
            bot boolean path '$.bot',
            username varchar(100) path '$.username'
        )
    ) j
    where g.id = 1
    group by g.id
) x
on g.id = x.id
set g.members = x.new_members
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62010614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档