更新数组中的mysql json字段

时间:2017-11-16 12:44:01

标签: mysql arrays json

有了这个json:

{
    f1: "abc",
    f2: [
        {id: 1, val:"a"},
        {id: 2, val:"b"},
        {id: 3, val:"c"}
    ],
    f3: [
        "a",
        "b",
        "c"
    ]
}

更新: 举个例子:

SELECT JSON_SEARCH(
'{"f1": "abc", "f2": [{"id": "1", "val":"a"},{"id": "2", "2":"b"},{"id": 3, "val":"2"}], "f3": ["a","b","c"]}',
'all', '1', null, '$.f2[*].id');

返回f2-> id == 1所需的路径 然后我可以使用

select json_set(
'{"f1": "abc", "f2": [{"id": "1", "val":"a"},{"id": "2", "2":"b"},{"id": 3, "val":"2"}], "f3": ["a","b","c"]}',
'$.f2[0].val', 'd');

更新数据。

SELECT JSON_SEARCH(
'{"f1": "abc", "f2": [{"id": 1, "val":"a"},{"id": "2", "2":"b"},{"id": 3, "val":"2"}], "f3": ["a","b","c"]}',
'all', '1', null, '$.f2[*].id');

找不到f2-> id == 1。

也没有
SELECT JSON_SEARCH( 
'{"f1": "abc", "f2": [{"id": 1, "val":"a"},{"id": "2", "2":"b"},{"id": 3, "val":"2"}], "f3": ["a","b","c"]}',
'all', 1, null, '$.f2[*].id');  

======

更新2: 我只会将ID保存为字符串......但是现在我还有其他问题:

SELECT JSON_SEARCH(
'{"mm": [{"id":"1","field":"test","value":33}]}',
'one', '1', null, '$.mm[*].id') as path;

正在运作

SELECT *  FROM document_data where document_id=5;
update document_data set data=JSON_SET(data, '$.mm', json_array()) where document_id=5;
update document_data set data=JSON_ARRAY_APPEND(data, '$.mm', '{"id":"1","field":"test","value":33}') where document_id=5;
SELECT JSON_SEARCH(data, 'one', '1', null, '$.mm[*].id') as path from document_data where id='5';

无效。似乎是引用。 有人可以帮忙吗?

==========

如何使用JSON_SET更新id == 2的f2?

尝试了所有事情,但我似乎无法弄明白该怎么做。

非常感谢 雷

1 个答案:

答案 0 :(得分:1)

根据设计,

JSON_SEARCH似乎只搜索字符串,请参阅WL#7909: Server side JSON functions :: JSON_SEARCH

一个非常不直观的选择是使用类似的东西(小心性能问题):

mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.7.20    |
+-----------+
1 row in set (0.00 sec)

mysql> SET @`json` := '{
    '>   "f1": "abc",
    '>   "f2": [
    '>           {"id": 1, "val": "a"},
    '>           {"id": 2, "val": "b"},
    '>           {"id": 3, "val": "c"}
    '>         ],
    '>   "f3": ["a", "b", "c"]
    '> }',
    ->     @`value` := 2,
    ->     @`base_path` := '$.f2';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT JSON_SEARCH(
    ->   REPLACE(
    ->     REPLACE(
    ->       REPLACE(
    ->         JSON_EXTRACT(@`json`, CONCAT(@`base_path`, '[*].id')),
    ->       ', ', '","'),
    ->     '[', '["'),
    ->   ']', '"]'),
    -> 'one', @`value`) INTO @`path`;
Query OK, 1 row affected (0.00 sec)

mysql> SELECT @`path`;
+---------+
| @`path` |
+---------+
| "$[1]"  |
+---------+
1 row in set (0.00 sec)

mysql> SELECT
    ->   CONCAT(
    ->     REPLACE(
    ->       JSON_UNQUOTE(@`path`),
    ->       '$',
    ->       @`base_path`
    ->     ),
    ->   '.val') INTO @`path`;
Query OK, 1 row affected (0.00 sec)

mysql> SELECT @`path`;
+-------------+
| @`path`     |
+-------------+
| $.f2[1].val |
+-------------+
1 row in set (0.00 sec)

mysql> SELECT JSON_SET(@`json`, @`path`, 'd');
+-------------------------------------------------------------------------------------------------------------------+
| JSON_SET(@`json`, @`path`, 'd')                                                                                   |
+-------------------------------------------------------------------------------------------------------------------+
| {"f1": "abc", "f2": [{"id": 1, "val": "a"}, {"id": 2, "val": "d"}, {"id": 3, "val": "c"}], "f3": ["a", "b", "c"]} |
+-------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

请参阅db-fiddle

相关问题