У меня есть поле 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?