【问题标题】:MySQL update specific JSON objects in an arrayMySQL 更新数组中的特定 JSON 对象
【发布时间】:2021-09-06 06:29:05
【问题描述】:

我正在努力寻找一种方法来更新 MySQL 中 JSON 类型字段中数组中的特定 JSON 对象。假设我有以下对象:

SET @j = '{
 "cat": "meow", 
 "dog": "woof", 
 "parrot": [
   {"volume": "quiet", "says": "hello"}, 
   {"volume": "loud", "says": "polly"},
   {"volume": "loud", "says": "cracker"}
  ]
}';

如何更新 parrot 数组中音量值为 loud 的所有对象?

我知道如果对象的位置已知,我可以使用 JSON_SET 或 JSON_REPLACE 函数来更改/更新特定对象。例如:

UPDATE T1 SET @J = JSON_SET(@j, '$.parrot[1].says', 'pretty bird');

但是我不知道对象的位置,而且这不会更新 parrot 数组中音量值为 loud 的所有对象? p>

有什么建议吗?

【问题讨论】:

  • 我们也有同样的担忧。您是否找到(并可能测试)解决方案?谢谢
  • @pAkY88 经过一些测试,我只是选择在应用程序级别而不是在数据库级别处理数据更改。就我而言,这是一个更快、更简单的解决方案。

标签: mysql json mysql-5.7


【解决方案1】:

一个选项:

DROP PROCEDURE IF EXISTS `sp_update_json`;

DELIMITER //

CREATE PROCEDURE `sp_update_json`(
  `json` JSON,
  `value` VARCHAR(255)
)
BEGIN
  DECLARE `array_objects` JSON DEFAULT
    REPLACE(JSON_SEARCH(`json`,
                'all',
                'loud',
                NULL,
                '$.parrot[*].volume'
               ), 'volume', 'says');
  DECLARE `max_objects` INT UNSIGNED DEFAULT 
    JSON_LENGTH(`array_objects`);
  DECLARE `current_object` INT UNSIGNED DEFAULT 0;
  WHILE `current_object` < `max_objects` DO
    SET `json` := JSON_REPLACE(`json`, 
                           JSON_UNQUOTE(                             
                             JSON_EXTRACT(
                               `array_objects`,
                               CONCAT('$[', `current_object`, ']')
                             )
                           ), `value`);
    SET `current_object` := `current_object` + 1;
  END WHILE;
  SELECT `json`;
END//

DELIMITER ;

SET @`j` := '
{
  "cat": "meow", 
  "dog": "woof", 
  "parrot": [
    {"volume": "quiet", "says": "hello"}, 
    {"volume": "loud", "says": "polly"},
    {"volume": "loud", "says": "cracker"}
  ]
}';

CALL `sp_update_json`(@`j`, 'pretty bird');

db-fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-01
    • 2022-08-13
    • 2017-04-27
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多