如何在mysql 5.7中更新json数组中的特定对象

vmdwslir  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(1210)

如何根据数组中的唯一值更新该对象?假设这是我的json对象,存储在一个名为objects的表和一个名为content的列中

table: objects

    id:  7383    
    content: { data:[{id: 111, active: 1 }, {id: 222, active: 1 }, {id: 333, active: 0 }] }

如果我知道元素在数组中的位置,我就可以更新对象

SET content = JSON_REPLACE(content,'$.data[1].active', 0)
Where id = 7383

但是,如果我不知道数组的位置,但知道对象中id的值(例如222),那么如何将id为222的对象的active更新为0?

jhkqcmku

jhkqcmku1#

目前,用mysql json函数查找数值比较复杂。在如下所示的json中,很简单:

{"id": "222", "active": 1}

有很多方法可以满足您的需求,我提供一种可以给您提供想法的方法(修改所有必要的内容):

UPDATE `objects`
SET `objects`.`content` = 
  JSON_REPLACE(`objects`.`content`, CONCAT('$.data',
  (SELECT
    JSON_UNQUOTE(
      REPLACE(
        JSON_SEARCH(
          REPLACE(
            REPLACE(
              REPLACE(
                `der`.`content` ->> '$.data[*].id',
                ', ',
                '","'),
              ']',
              '"]'),
          '[',
          '["'),
        'one',
        '222'),
      '$',
      '')
    )
  FROM (SELECT `objects`.`content`
        FROM `objects`
        WHERE `objects`.`id` = 7383) `der`
  ), '.active'), 0)
WHERE `objects`.`id` = 7383;

小心可能的性能问题。
见小提琴。
在mysql的最新版本(>=8.0.4)中,这句话要简单得多:

UPDATE `objects`
  INNER JOIN JSON_TABLE(
    `objects`.`content`,
    '$.data[*]' COLUMNS(
      `rowid` FOR ORDINALITY,
      `id` INT PATH '$.id'
    )
  ) `der` ON `der`.`id` = 222
SET `objects`.`content` =
  JSON_REPLACE(
    `objects`.`content`,
    CONCAT('$.data[', `der`.`rowid` - 1, '].active'),
    0)
WHERE
  `objects`.`id` = 7383;

见db小提琴。

相关问题