2016-07-13 52 views
5

Vorrei (idealmente) come aggiornare una riga in Cassandra utilizzando puro JSON (ad esempio, analogo alla dichiarazione CQL "INSERT INTO <table_name> JSON '<json_object_string>';"). Tuttavia, non sembra che tale funzionalità esista tramite l'istruzione UPDATE di CQL.Esiste un modo elegante per eseguire un aggiornamento JSON tramite CQL (Cassandra)?

Un approccio (cervello morto) che ho considerato era quello di eliminare e quindi reinserire la riga pertinente. Tuttavia, questo approccio ha sicuramente i suoi svantaggi, quindi, eliminandolo dal mio set di considerazione.

Ho implementato una versione che utilizza l'istruzione CQL "UPDATE <table_name> SET <key1> = '<new_value1>', <key2> = '<new_value2>', ..., <keyN> = '<new_valueN>';". Tuttavia, se ci fosse qualcosa come "UPDATE <table_name> JSON '<new_json_object_string>';", mi piacerebbe davvero saperlo.

risposta

4

In cassandra, INSERT e UPDATE sono la stessa operazione. Per il supporto JSON di Cassandra, non è disponibile la funzionalità UPDATE.

Non esiste inoltre alcun supporto di aggiornamento JSON parziale, vale a dire dopo aver inserito una riga, non è possibile aggiornare singole colonne utilizzando JSON come qualsiasi colonna omessa dal payload json vengono inserite come null (pietre tombali). È tuttavia possibile utilizzare le normali query INSERT/UPDATE.

CASSANDRA-11424 cerca di risolvere questo.

+0

Andy, ho appena determinato che INSERT fa anche un UPDATE durante lo sviluppo dei miei test. Per la mia attuale applicazione, questo comportamento (INSERT fa un UPDATE) potrebbe essere un po 'problematico se si rivelano casi in cui INSERT deve solo INSERIRE se la coppia chiave/valore non esiste. In tal caso, sembra che avrei bisogno di leggere per determinare se la coppia chiave/valore esiste o meno prima di consentire l'INSERIMENTO. Ugh, in tal caso ... –

+0

Se sei preoccupato di sostituire un record esistente puoi usare 'INSERT INTO

JSON .... SE NON ESISTE;'. Ci sarà una penalità di prestazioni per questo, ma potrebbe valerne la pena ed è più appropriato che leggere prima di scrivere. –

+0

Andy, non l'ho ancora provato, ma credo che "INSERIRE IN

JSON SE NON ESISTE;" non aggiornerà i campi che sono cambiati. L'ideale sarebbe aggiornare i campi che sono cambiati e lasciare i campi specificati da soli. (Sembra che questa funzionalità funzioni con "UPDATE
SET ...;". Tuttavia, sarebbe bello avere la "UPDATE JSON ...;" corrispondente a "INSERIRE
JSON ...;".) –

0

La funzionalità è ora disponibile in CQL 5.1. La sintassi è:

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

L'opzione DEFAULT UNSET rende sovrascrivere solo i valori trovati nella stringa JSON. Pertanto, ad esempio, se si hanno altre colonne (ad es. Colonna3, colonna4) con i dati nel record, tali colonne manterranno i loro dati originali quando viene eseguita l'istruzione di inserimento precedente.