2016-03-28 8 views
1

JSONカラムを扱うmysql 5.7用の新しいAPIを試しています。私test列には、次のようになります。mysql 5.7ネストされたjsonオブジェクトにキー/値を追加する

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

私がやりたいそれは何"foo":{"efg":1, "klm":2}になりますので、たとえばfooため、鍵の一つに追加されます。私は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":[{"efg":1}, {"klm":2}]、にfooを変換します。

私は、クエリを一緒に組み合わせて試してみた:

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

あるべき '{ "FOO":{ "EFG":1、 "KLM":2}、" bar ":{" abc ":0}}'。それらのドキュメントは主に配列の変更で動作しますが、すべてをObjectとして保持したいと思います。 – denikov

+0

私は、あなたの 'json_insert'を使って正確な結果を得ています(あるいは' name = 'Joe'; table1から 'json_insert(test、 '$ .foo.klm'、2)を選択してください; –

+0

@JoachimIsaksson私はあなたのコメントのようないくつかのパラメータを出し、 '' foo ''オブジェクトの全てを置き換えています。 – denikov

答えて

2

問題を再現できません。

試験:所望の結果@JoachimIsaksson

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

あなたの例から単語を実行したとき、それは正しく機能しました。だから最初は行にオブジェクトを誤って追加されましたか?私は 'table1(テスト)の値( '{" foo ":{" efg ":1}、" bar ":{" abc ":0}}')に'を直接挿入しました。それは問題ですか? – denikov

+0

@denikov:更新された回答。 – wchiquito

+0

更新いただきありがとうございます。私は数時間後にそれを試し、うまくいけばそれを理解するでしょう。助けてくれてありがとう。 – denikov

関連する問題