更新数组中的mysql json字段
有了这个json:更新数组中的mysql json字段,mysql,arrays,json,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"}
{
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');
更新数据
但是
找不到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_集更新id==2的f2
我什么都试过了,但似乎不知道怎么做
非常感谢
根据设计,Rene似乎只搜索字符串,请参阅
一个非常不直观的选项是使用(小心性能问题):
mysql>选择版本();
+-----------+
|版本(|
+-----------+
| 5.7.20 |
+-----------+
一行一组(0.00秒)
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';
查询正常,0行受影响(0.00秒)
mysql>选择JSON\u搜索(
->替换(
->替换(
->替换(
->JSON_EXTRACT(@`JSON`,CONCAT(@`base_path`,'[*].id')),
-> ', ', '","'),
-> '[', '["'),
-> ']', '"]'),
->“一”,“值”转换为“路径”;
查询正常,1行受影响(0.00秒)
mysql>选择@`path`;
+---------+
|@`path`|
+---------+
| "$[1]" |
+---------+
一行一组(0.00秒)
mysql>选择
->海螺(
->替换(
->JSON_UNQUOTE(@`path`),
-> '$',
->@`基本路径`
-> ),
->“.val”)转换为@'path`;
查询正常,1行受影响(0.00秒)
mysql>选择@`path`;
+-------------+
|@`path`|
+-------------+
|$.f2[1].val|
+-------------+
一行一组(0.00秒)
mysql>选择JSON_集(@`JSON`、@`path`、'd');
+-------------------------------------------------------------------------------------------------------------------+
|JSON_集(@`JSON`、@`path`、'd'))|
+-------------------------------------------------------------------------------------------------------------------+
|{“f1”:“abc”,“f2”:[{“id”:1,“val”:“a”},{“id”:2,“val”:“d”},{“id”:3,“val”:“c”}],“f3”:[“a”,“b”,“c”]}|
+-------------------------------------------------------------------------------------------------------------------+
一行一组(0.00秒)
请参阅。如果您尝试了所有方法,则至少发布一次尝试。发布不起作用的查询,以便我们可以帮助您使其起作用。看,你的问题不清楚,我无法重现你提到的新问题,看,问题解决了。它不会将字符串转换为json…谢谢。但那绝对不是我想要的。。。我将把ID保存为字符串。但我补充了一些评论。MySQL和JSON似乎没有那么好用。。。
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';