2017-11-16 10 views
0

このJSON:を有するUpdateing MySQLの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'); 

は> [2-ために必要なパスを返すID == 1 Iは次いで缶:例として

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'); 

〔2-見つけることができません>の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が保存されます...しかし、今、私はonother問題を抱えている:

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'; 

を進めています。引用されているようです。 誰かを助けることができますか?

==========

は、どのように私は、ID == 2がJSON_SETを使用してF2キーを更新することができますか?

私はそれ以外の方法を試してみることはできません。

感謝 ルネ

+0

もしあなたがすべてを試してみたら、少なくともあなたがした試行を投稿してください。あなたの質問を投稿して、それが働くように助けてくれるようにしてください。 – ProEvilz

+0

あなたの質問は明確ではなく、あなたが言及した新しい問題を再現することはできません。[db-fiddle](https://www.db- fiddle.com/f/mYyYHrd4PHDL7nQW1YALKd/0)。 – wchiquito

+0

問題が解決しました。文字列をjsonに変換しないと... –

答えて

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を参照してください:

1つのオプションは、非常に直感的のようなものを(パフォーマンスの問題に注意してください)を使用することです。

+0

ありがとう。しかし、それは確かに私が望むものではありません...私はちょうど文字列としてIDを保存します。しかし、私はもう少しコメントを追加しました。 MySQLとJSONはうまく動作しません... –