2016-03-28 1 views
1

J'essaie la nouvelle API pour mysql 5.7 qui traite des colonnes JSON. Ma test colonne ressemble à ceci:mysql 5.7 ajout de la clé/valeur à l'objet json imbriqué

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

Ce que je voudrais faire est append à l'une des clés, par exemple foo il se traduira par "foo":{"efg":1, "klm":2}. Ce que j'ai essayé jusqu'à la suite their documentation:

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

Qu'est-ce qui ne fait remplacer "efg":1 et le résultat est "foo":{"klm":2}.

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

La ligne ci-dessus convertit évidemment foo dans un tableau "foo":[{"efg":1}, {"klm":2}], ce qui est pas ce que je veux.

J'ai essayé de combiner les requêtes ensemble:

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

Ce me donne juste une erreur de syntaxe near select json_extract(test, '$.foo').

Un conseil serait grandement apprécié.

+0

@JoachimIsaksson le résultat souhaité doit être '{ "foo": { "efg": 1, "klm": 2}," bar ": {" abc ": 0}}'. Leur documentation fonctionne principalement avec des tableaux modifiants, mais je voudrais garder tout comme un objet. – denikov

+0

J'obtiens ce résultat exact en utilisant votre 'json_insert', ou juste' select json_insert (test, '$ .foo.klm', 2) de table1 où name = 'Joe'; '' "efg": 1' ne –

+0

@JoachimIsaksson Je ne sais pas où est le problème, j'ai émis des paramètres, comme dans votre commentaire, et cela remplace tout ce qui concerne l'objet '' foo' '' – denikov

Répondre

2

Je ne peux pas reproduire le problème.

Test:

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) 

MISE À JOUR

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

Lorsque j'ai exécuté mot à mot à partir de votre exemple, cela a fonctionné correctement. Alors peut-être initialement ajouté l'objet incorrectement dans la ligne? Je l 'ai ajouté directement à l' intérieur de 'insert 'dans table1 (test) valeurs (' {" foo ": {" efg ": 1}," bar ": {" abc ": 0}} ');'. Est-ce le problème? – denikov

+0

@denikov: Réponse mise à jour. – wchiquito

+0

Merci pour la mise à jour. Je vais essayer dans quelques heures et j'espère que je l'aurai compris. Merci pour ton aide. – denikov