mysql - 如何向 MariaDB 中的现有 JSON 对象添加新对象?
问题描述
我有一个 JSON 字段,其中包含一个包含多个子对象的对象。该表如下所示:
+---------+----------------------------------------------------------------+
|store_num| fruit_stock |
+---------+----------------------------------------------------------------+
| AL258 | '{"fruits":{"apple":67,"banana":91,"plum":53}}' |
+---------+----------------------------------------------------------------+
| OR419 | '{"fruits":{"apple":109,"banana":44,"plum":98}}' |
+---------+----------------------------------------------------------------+
我想使用准备好的语句将对象 {"mango":45} 添加到“AL258”商店。我遇到了一些问题。首先是向另一个对象添加一个对象并不像我想象的那么简单。事实证明,我必须使用 JSON_OBJECT() 函数创建芒果对象,然后开始:
JSON_OBJECT("mango", 45)
'{"mango":45}'
然后我必须获取“fruits”对象的内容,所以我必须为此使用 JSON_QUERY() 函数:
JSON_QUERY(fruit_stock, '$.fruits')
'{"apple":67, "banana":91, "plum":53}'
然后不得不合并新的芒果对象和水果对象的内容。由于我想替换我要插入的字段(如果它已经存在),我需要使用 JSON_MERGE_PATCH() 函数:
JSON_MERGE_PATCH(
JSON_QUERY(fruit_stock, '$.fruits'), -- the contents of fruit_stock: '{"apple":67,"banana":91,"plum":53}'
JSON_OBJECT("mango", 45) -- the new mango object: '{"mango":45}'
)
现在我有了裸对象字段 '{"apple":67、"banana":91、"plum":53}' 和 '{"mango":45}' 我需要将它们组合成 "fruits"目的。为此,我需要使用 JSON_OBJECT() 函数创建一个全新的“水果”对象:
JSON_OBJECT(
'fruits', -- the new fruits object
JSON_MERGE_PATCH( -- the contents of fruit_stock
JSON_QUERY(fruit_stock, '$.fruits'), -- the new mango object
JSON_OBJECT("mango", 45)
)
)
'{"fruits":{"apple":67, "banana":91, "plum":53, "mango":45}}'
添加 WHERE 子句以选择商店...
UPDATE store_table SET fruit_stock =
JSON_OBJECT(
'fruits',
JSON_MERGE_PATCH(
JSON_QUERY(fruit_stock, '$.fruits'),
JSON_OBJECT("mango", 45)
)
)
WHERE HEX(store) = 'AL258';
结果如下表:
+---------+----------------------------------------------------------------+
|store_num| fruit_stock |
+---------+----------------------------------------------------------------+
| AL258 | '{"fruits":{"apple":67,"banana":91,"plum":53,"mango":45}}' |
+---------+----------------------------------------------------------------+
| OR419 | '{"fruits":{"apple":109,"banana":44,"plum":98}}' |
+---------+----------------------------------------------------------------+
我的问题:这是执行此操作的最佳方法,还是使用 MariaDB 有更有效和/或可读性更高的选项?
解决方案
只需使用与现有 json 类似的语法来使用JSON_MERGE_PATCH()
function 添加值:
UPDATE store_table
SET fruit_stock = JSON_MERGE_PATCH(fruit_stock, '{"fruits":{"mango": 45}}')
WHERE store_num = 'AL258';
推荐阅读
- ios - 在 UITableView 中重用单元格
- docker - 在本地 Jenkins 多分支管道中找不到 Docker 命令
- ruby - Sass 的问题:“找不到 'sass'”
- javascript - 使用 jquery 和 javascript 创建自动确认
- wso2 - 资源所有者密码凭据授予返回错误
- julia - Julia 在将解决方案转换为数组时的微分方程问题
- r - 如何根据R推荐器实验室中的关联规则获得推荐器预测的LHS?
- mysql - MySQL命令行问题
- mariadb - MariaDB 10.1.33 不断崩溃
- verilog - 系统 Verilog 减法去除重要位