2016-07-13 1 views
5

Je voudrais (idéalement) mettre à jour une ligne dans Cassandra en utilisant du JSON pur (par exemple, analogue à l'instruction CQL "INSERT INTO <table_name> JSON '<json_object_string>';"). Cependant, il ne semble pas qu'une telle fonctionnalité existe via l'instruction CQL UPDATE.Existe-t-il un moyen élégant d'effectuer une mise à jour JSON via CQL (Cassandra)?

Une approche (cerveau mort) que j'ai considéré était de supprimer, puis réinsérer la ligne pertinente. Cependant, cette approche a certainement ses inconvénients - donc, l'éliminer de mon ensemble de considération.

J'ai implémenté une version utilisant l'instruction CQL "UPDATE <table_name> SET <key1> = '<new_value1>', <key2> = '<new_value2>', ..., <keyN> = '<new_valueN>';". Cependant, s'il y avait quelque chose comme «UPDATE <table_name> JSON '<new_json_object_string>';», j'aimerais vraiment savoir à ce sujet.

Répondre

4

Dans Cassandra, INSERT et UPDATE sont la même opération. Pour le support JSON de Cassandra, il n'y a pas de capacité UPDATE. Il n'y a pas non plus de prise en charge partielle des mises à jour JSON, c'est-à-dire après insertion d'une ligne, vous ne pouvez pas mettre à jour des colonnes individuelles en utilisant JSON car toutes les colonnes de la charge json sont insérées en tant que nulls. Vous pouvez cependant utiliser les requêtes régulières INSERT/UPDATE.

CASSANDRA-11424 cherche à résoudre ce problème.

+0

Andy, je viens de déterminer que INSERT effectue également une mise à jour lors du développement de mes tests. Pour mon application actuelle, ce comportement (INSERT fait un UPDATE) peut être un peu problématique s'il s'avère qu'il y a des cas où INSERT devrait seulement INSERT si la paire clé/valeur n'existe pas. Dans ce cas, il semble que je devrais lire afin de déterminer si la paire clé/valeur existe avant d'autoriser l'insertion. Ugh, dans ce cas ... –

+0

Si vous êtes préoccupé par le remplacement d'un enregistrement existant, vous pouvez utiliser 'INSERT INTO

JSON .... SI PAS EXISTS;'. Il y aura une pénalité de performance pour cela, mais cela peut en valoir la peine et est plus approprié que de lire avant d'écrire. –

+0

Andy, je ne l'ai pas encore testé, mais je crois que "INSERT INTO

JSON SI PAS EXISTE;" ne mettra pas à jour les champs qui ont changé. L'idéal serait de mettre à jour les champs qui ont changé et de laisser les champs spécifiés seuls. (Il semble que cette fonctionnalité fonctionne avec "UPDATE
SET ...;" Cependant, ce serait bien d'avoir le "UPDATE
JSON ...;" homologue à "INSERT
JSON ...;"). –

0

La fonctionnalité est maintenant disponible en CQL 5.1. La syntaxe est:

INSERT INTO table_name JSON '{"column1": "value1", "column2": "value2"}' DEFAULT UNSET; 

L'option DEFAULT UNSET fait remplacer que les valeurs trouvées dans la chaîne JSON. Ainsi, par exemple, si vous avez d'autres colonnes (par exemple colonne3, colonne4) avec des données dans l'enregistrement, ces colonnes conservent leurs données d'origine lorsque l'instruction d'insertion ci-dessus est exécutée.