Как добавить новый объект в существующий объект JSON в MariaDB? - PullRequest
1 голос
/ 15 января 2020

У меня есть поле JSON с объектом в нем, который содержит несколько подобъектов. Таблица выглядит следующим образом:

+---------+----------------------------------------------------------------+
|store_num|                           fruit_stock                          |
+---------+----------------------------------------------------------------+
| AL258   | '{"fruits":{"apple":67,"banana":91,"plum":53}}'                |
+---------+----------------------------------------------------------------+
| OR419   | '{"fruits":{"apple":109,"banana":44,"plum":98}}'               |
+---------+----------------------------------------------------------------+

Я хочу добавить объект {"man go": 45} в хранилище "AL258", используя подготовленный оператор. Я столкнулся с некоторыми проблемами, делающими это. Сначала добавление объекта к другому объекту было не так просто, как я думал. Оказывается, мне пришлось создать объект man go с помощью функции JSON_OBJECT (), чтобы начать с:

JSON_OBJECT("mango", 45)

'{"mango":45}'

Затем мне пришлось получить содержимое объекта "fruits", поэтому мне пришлось используйте для этого функцию JSON_QUERY ():

JSON_QUERY(fruit_stock, '$.fruits')

'{"apple":67, "banana":91, "plum":53}'

Затем пришлось объединить новый объект man go и содержимое объекта fruits. Поскольку я хочу заменить вставляемое поле, если оно уже существует, мне нужно было использовать функцию 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, "банан": 91, "слива": 53} 'и' {"человек go": 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?

1 Ответ

1 голос
/ 15 января 2020

Просто используйте тот же синтаксис, что и существующие jsons для значений, добавляемых с помощью функции JSON_MERGE_PATCH():

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

Демо

...