如何在MariaDB中将新对象添加到现有JSON对象?

时间:2020-01-15 14:34:39

标签: 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}'

然后我必须获取“水果”对象的内容,因此必须为此使用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()函数创建一个全新的“水果”对象:

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更有效率和/或更具可读性的选择?

1 个答案:

答案 0 :(得分:2)

只需使用与现有json相似的语法,即可通过JSON_MERGE_PATCH()函数添加值:

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

Demo