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" 的两个列的表,您将执行以下操作
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()
参数)中将接受的编码以及 Cassandra 在返回 SELECT JSON
语句(和 from_json()
)的数据时将使用的格式
类型 | 接受的格式 | 返回格式 | 说明 |
---|---|---|---|
|
字符串 |
字符串 |
使用 JSON 的 |
|
整数、字符串 |
整数 |
字符串必须是有效的 64 位整数 |
|
字符串 |
字符串 |
字符串应为 0x 后跟偶数个十六进制数字 |
|
布尔值、字符串 |
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 位整数 |