JSON サポート
Cassandra 2.2 では、SELECT <select-statement>
ステートメントと INSERT <insert-statement>
ステートメントに JSON サポートが導入されました。このサポートは、CQL API を根本的に変更するものではありません(たとえば、スキーマは引き続き適用されます)。単に、JSON ドキュメントを操作するための便利な方法を提供します。
SELECT JSON
SELECT
ステートメントでは、JSON
キーワードを使用して、各行を単一の JSON
エンコードされたマップとして返します。SELECT
ステートメントの残りの動作は同じです。
結果マップのキーは、通常の結果セットの列名と一致します。たとえば、SELECT JSON a, ttl(b) FROM …
のようなステートメントは、"a"
と "ttl(b)"
というキーを持つマップになります。ただし、INSERT JSON
の動作との対称性のために、大文字を含む大文字小文字を区別する列名は、二重引用符で囲まれます。たとえば、SELECT JSON myColumn FROM …
は、エスケープされた引用符を含むマップキー "\"myColumn\""
を生成します。
マップの値は、結果セットの値の JSON エンコードされた表現(下記参照)になります。
INSERT JSON
INSERT
ステートメントでは、新しい JSON
キーワードを使用して、JSON
エンコードされたマップを単一行として挿入できます。JSON
マップの形式は、一般的に、同じテーブルに対する SELECT JSON
ステートメントによって返される形式と一致する必要があります。特に、大文字小文字を区別する列名は、二重引用符で囲む必要があります。たとえば、「myKey」と「value」という2つの列を持つテーブルに挿入するには、次の操作を行います。
INSERT INTO mytable JSON '{ "\"myKey\"": 0, "value": 0}';
デフォルト(または DEFAULT NULL
が明示的に使用されている場合)、JSON
マップから省略された列は NULL
に設定されます。つまり、その列の既存の値は削除されます(墓石が作成されます)。または、値の後に DEFAULT UNSET
ディレクティブを使用すると、省略された列の値は設定されません。つまり、それらの列の既存の値は保持されます。
Cassandra データ型の JSON エンコーディング
可能な限り、Cassandra はネイティブ JSON
表現でデータ型を表し、受け入れます。Cassandra は、すべての単一フィールド型の CQL リテラル形式と一致する文字列表現も受け入れます。たとえば、浮動小数点数、整数、UUID、日付は、CQL リテラル文字列で表すことができます。ただし、コレクション、タプル、ユーザー定義型などの複合型は、ネイティブ JSON
コレクション(マップとリスト)またはコレクションの JSON エンコードされた文字列表現で表す必要があります。
次の表は、Cassandra が INSERT JSON
値(および from_json()
引数)で受け入れるエンコーディングと、SELECT JSON
ステートメント(および from_json()
)のデータの返却時に Cassandra が使用する形式について説明しています。
型 | 受け入れられる形式 | 戻り値の形式 | 備考 |
---|---|---|---|
|
文字列 |
文字列 |
JSON の |
|
整数、文字列 |
整数 |
文字列は有効な 64 ビット整数である必要があります |
|
文字列 |
文字列 |
文字列は 0x の後に偶数の 16 進数の数字が続く必要があります |
|
ブール値、文字列 |
boolean |
文字列は "true" または "false" である必要があります |
|
文字列 |
文字列 |
|
|
整数、浮動小数点数、文字列 |
浮動小数点数 |
クライアント側のデコーダーで 32 ビットまたは 64 ビット IEEE-754 浮動小数点の精度を超える可能性があります |
|
整数、浮動小数点数、文字列 |
浮動小数点数 |
文字列は有効な整数または浮動小数点数である必要があります |
|
整数、浮動小数点数、文字列 |
浮動小数点数 |
文字列は有効な整数または浮動小数点数である必要があります |
|
文字列 |
文字列 |
IPv4 または IPv6 アドレス |
|
整数、文字列 |
整数 |
文字列は有効な 32 ビット整数である必要があります |
|
リスト、文字列 |
list |
JSON のネイティブリスト表現を使用 |
|
マップ、文字列 |
map |
JSON のネイティブマップ表現を使用 |
|
整数、文字列 |
整数 |
文字列は有効な 16 ビット整数である必要があります |
|
リスト、文字列 |
list |
JSON のネイティブリスト表現を使用 |
|
文字列 |
文字列 |
JSON の |
|
文字列 |
文字列 |
|
|
整数、文字列 |
文字列 |
タイムスタンプ。文字列定数は、タイムスタンプを日付として入力できます。 |
|
文字列 |
文字列 |
タイプ 1 UUID。UUID の形式については、定数を参照してください。 |
|
整数、文字列 |
整数 |
文字列は有効な 8 ビット整数である必要があります |
|
リスト、文字列 |
list |
JSON のネイティブリスト表現を使用 |
|
マップ、文字列 |
map |
フィールド名をキーとする JSON のネイティブマップ表現を使用 |
|
文字列 |
文字列 |
UUID の形式については、定数を参照してください。 |
|
文字列 |
文字列 |
JSON の |
|
整数、文字列 |
整数 |
可変長。クライアント側のデコーダーで 32 ビットまたは 64 ビット整数をオーバーフローする可能性があります |