2016-03-28 103 views
1

我正在嘗試用於處理JSON列的mysql 5.7的新API。我test列如下:mysql 5.7將鍵/值附加到嵌套的json對象

{"foo":{"efg":1}, "bar":{"abc":0}} 

我想要做的就是追加到的關鍵之一,例如foo所以它會導致"foo":{"efg":1, "klm":2}。我已經試過到目前爲止以下their documentation

mysql> select json_insert(test, '$.foo', 10, '$.foo.klm', 2) from table1 
     where name='Joe'; 

,做什麼是替代"efg":1,結果是"foo":{"klm":2}

mysql> select json_array_append(test, '$.foo', '{"klm":2}') from table1 where 
     name="Joe'; 

上面一行明顯的轉換foo到一個數組"foo":[{"efg":1}, {"klm":2}],這不是我想要的。

我試着結合在一起的查詢:

mysql> select json_insert(test, '$.foo', 10, '$.foo', 
     select json_merge(select json_extract(test, '$.foo') from table1 
     where name="Joe"), '{"klm":2}') from table1 where name="Joe"; 

這只是給了我一個語法錯誤near select json_extract(test, '$.foo')

任何意見將不勝感激。

+0

@JoachimIsaksson期望的結果應該是'{ 「foo」 的:{ 「EFG」:1, 「KLM」:2},「欄 「:{」 ABC「:0}}'。他們的文檔主要用於修改數組,但我想將所有內容都保存爲Object。 – denikov

+0

我使用'json_insert'得到了確切的結果,(或者只是'從table1中選擇json_insert(test,'$ .foo.klm',2),其中name ='Joe';''「efg」:1'不會 –

+0

@JoachimIsaksson我不知道問題出在哪兒,我發出了一些參數,就像在你的評論中一樣,它仍然替換了''foo''Object的所有內容。 – denikov

回答

2

我無法重現該問題。

測試:

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

mysql> SET @`test` := '{"foo": {"efg":1}, "bar": {"abc":0}}'; 
Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT JSON_INSERT(@`test`,/*'$.foo', 10,*/ '$.foo.klm', 2); 
+--------------------------------------------------+ 
| JSON_INSERT(@`test`, '$.foo.klm', 2)    | 
+--------------------------------------------------+ 
| {"bar": {"abc": 0}, "foo": {"efg": 1, "klm": 2}} | 
+--------------------------------------------------+ 
1 row in set (0.00 sec) 

UPDATE

mysql> DROP TABLE IF EXISTS `table1`; 
Query OK, 0 rows affected, 1 warning (0.00 sec) 

mysql> CREATE TABLE IF NOT EXISTS `table1` (
    -> `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    -> `test` JSON 
    ->); 
Query OK, 0 rows affected (0.00 sec) 

mysql> INSERT INTO `table1` 
    ->  (`test`) 
    -> VALUES 
    ->  ('{"foo": {"efg":1}, "bar": {"abc":0}}'); 
Query OK, 1 row affected (0.01 sec) 

mysql> SELECT `id`, `test` FROM `table1`; 
+----+----------------------------------------+ 
| id | test         | 
+----+----------------------------------------+ 
| 1 | {"bar": {"abc": 0}, "foo": {"efg": 1}} | 
+----+----------------------------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT JSON_INSERT(@`test`, '$.foo.klm', 2) 
    -> FROM `table1` 
    -> WHERE `id` = 1; 
+--------------------------------------------------+ 
| JSON_INSERT(@`test`, '$.foo.klm', 2)    | 
+--------------------------------------------------+ 
| {"bar": {"abc": 0}, "foo": {"efg": 1, "klm": 2}} | 
+--------------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> UPDATE `table1` 
    -> SET `test` = JSON_INSERT(@`test`, '$.foo.klm', 2) 
    -> WHERE `id` = 1; 
Query OK, 1 row affected (0.00 sec) 
Rows matched: 1 Changed: 1 Warnings: 0 

mysql> SELECT `id`, `test` FROM `table1`; 
+----+--------------------------------------------------+ 
| id | test            | 
+----+--------------------------------------------------+ 
| 1 | {"bar": {"abc": 0}, "foo": {"efg": 1, "klm": 2}} | 
+----+--------------------------------------------------+ 
1 row in set (0.00 sec) 
+0

當我從你的例子逐字執行時,它工作正常。所以最初可能最初將對象錯誤地添加到行中?我直接在'insert into table1(test)values('{「foo」:{「efg」:1},「bar」:{「abc」:0}}'';')中加入它。這是問題嗎? – denikov

+0

@denikov:更新了答案。 – wchiquito

+0

感謝您的更新。我會在幾個小時內嘗試它,並希望弄清楚。感謝您的幫助。 – denikov