如何根据对象中的唯一值更新数组中的对象?假设这是我的 json 对象,它存储在一个名为 objects 的表和一个名为 content 的列中
table: objects
id: 7383
content: { data:[{id: 111, active: 1 }, {id: 222, active: 1 }, {id: 333, active: 0 }] }
Run Code Online (Sandbox Code Playgroud)
如果我知道数组中元素的位置,我可以更新对象
SET content = JSON_REPLACE(content,'$.data[1].active', 0)
Where id = 7383
Run Code Online (Sandbox Code Playgroud)
但是,如果我不知道数组的位置,但我知道对象中 id 的值(例如 222),如何将具有 id: 222 的对象的 active 更新为 0 ?
目前,使用 MySQL JSON 函数查找数值很复杂。在像下面这样的 JSON 中,它会很简单:
{"id": "222", "active": 1}
Run Code Online (Sandbox Code Playgroud)
有很多方法可以获取您需要的内容,我介绍一种可以为您提供想法的方法(修改所有必要的内容):
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;
Run Code Online (Sandbox Code Playgroud)
当心可能的性能问题。
请参阅dbfiddle。
在最新版本的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;
Run Code Online (Sandbox Code Playgroud)
请参阅db-fiddle。
| 归档时间: |
|
| 查看次数: |
5624 次 |
| 最近记录: |