2016-07-13 24 views
5

純粋なJSONを使用してCassandraの行を更新するのが理想的です(たとえば、「INSERT INTO <table_name> JSON '<json_object_string>';」のCQL文に類似しています)。ただし、CQL UPDATEステートメントを介してこのような機能が存在するようには見えません。CQL(Cassandra)を使用してJSONアップデートを行うためのエレガントな方法はありますか?

私が考えた(脳死)アプローチは、関連する行を削除してから挿入し直すことでした。しかし、そのアプローチには欠点があります。つまり、それを私の配慮から除外します。

私は、 "UPDATE <table_name> SET <key1> = '<new_value1>', <key2> = '<new_value2>', ..., <keyN> = '<new_valueN>';" CQLステートメントを利用したバージョンを実装しました。しかし、「UPDATE <table_name> JSON '<new_json_object_string>';」のようなものがあれば、それについて本当に知りたいです。

答えて

4

cassandraでは、INSERTUPDATEは同じ操作です。カサンドラのjsonサポートのために、UPDATE能力はありません。

JSON更新のサポートもありません。つまり、行を挿入すると、jsonペイロードから除外された列がnull(墓碑)として挿入されるため、JSONを使用して個々の列を更新することはできません。ただし、通常のINSERT/UPDATEクエリを使用できます。

CASSANDRA-11424これを解決しようとしています。

+0

Andy、テストを進めるときにINSERTもUPDATEを実行すると判断しました。私の現在のアプリケーションでは、この(INSERTはUPDATEを行う)ビヘイビアは、キーと値のペアが存在しない場合にINSERTだけをINSERTする必要がある場合に問題になることがあります。その場合、INSERTを許可する前にキー/値のペアが存在するかどうかを判断するために、読み込む必要があるようです。その場合は... –

+0

既存のレコードを置き換えることに懸念がある場合は、 'INSERT INTO

JSON ....存在しない場合は'を使用できます。 'それにはパフォーマンス上のペナルティがありますが、それは価値があり、書き込む前に読むよりも適切です。 –

+0

Andy、まだテストしていませんが、 "INSERT INTO

JSON 存在しない場合は"変更されたフィールドは更新されません。理想的なのは、変更されたフィールドを更新し、指定されたフィールドだけを残すことです。 (私はその機能を "UPDATE
SET ...;"と一緒に使っているようですが、 "
JSON ...;"に相当する "UPDATE
JSON ...;"の対応が良いです。 –

0

機能はCQL 5.1で利用可能になりました。構文は次のとおりです。

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

DEFAULT UNSETオプションは、それだけでJSON文字列で見つかった値を上書きします。たとえば、レコード内のデータを含む他の列(column3、column4など)がある場合、これらの列は、上記の挿入文を実行すると元のデータを保持します。

関連する問題