mysql - 如何将新对象添加到 MariaDB 中现有的 JSON 对象中?

标签 mysql json sql-update mariadb

我有一个 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}' 我需要将它们组合到“水果”对象。为此,我需要使用 JSON_OBJECT() 函数创建一个全新的“fruits”对象:

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() 函数添加值:

UPDATE store_table 
   SET fruit_stock = JSON_MERGE_PATCH(fruit_stock, '{"fruits":{"mango": 45}}') 
 WHERE store_num = 'AL258';

Demo

关于mysql - 如何将新对象添加到 MariaDB 中现有的 JSON 对象中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59753566/

相关文章:

php - 快速插入 250k 行

php - 我想将名称、描述和图像插入到数据库中。我的代码有什么问题吗?

php - 使用PHP的SQL SUM函数

mysql - 如何使用 RAND() 别名来使用 HAVING 子句

javascript - 如何从 JSON 创建动态路由列表?

sql - 通过删除绝对路径并保留文件名来更新数据库列

javascript - jQuery Form - 序列化为多维数组?

android - 进行网络调用和解析 JSON 响应的架构

MySQL操作分层数据

sql - 如何使用 100 条记录的表中每一行的不同值更新表中所有行的列