数据类型

SequoiaDB 巨杉数据库 JSON 实例支持的数据类型如下表所示:

值类型定义比较优先级权值用例
整数范围:-2147483648 至 214748364710{ “key” : 123 }
长整数范围:-9223372036854775808 至 9223372036854775807
如果用户指定的数值无法适用于整数,则 SequoiaDB 自动将其转化为浮点型
10{ “key” : 3000000000 }
{ “key” : { “$numberLong” : “3000000000” } }
浮点数范围:-1.7E+308 至 1.7E+30810{ “key” : 123.456 }
{ “key” : 123e+50 }
高精度数范围:小数点前最高 131072 位,小数点后最高 16383 位10{ “key” : { $decimal:”123.456” } }
字符串双引号包含的字符串15{ “key” : “value” }
对象 ID(OID)由十二字节字符构建而成35{ “key” : { “$oid” : “123abcd00ef12358902300ef” } }
布尔true 或者 false40{ “key” : true }{ “key” : false }
日期格式:YYYY-MM-DD
范围:0000-01-01 至 9999-12-31
45{ “key” : { “$date” : “2012-01-01” } }
时间戳格式:YYYY-MM-DD-HH.mm.ss.ffffff
范围:1902-01-01 00:00:00.000000 至 2037-12-31 23:59:59.999999
45{ “key” : { “$timestamp” : “2012-01-01-13.14.26.124233” } }
二进制数据Base64 形式的二进制数据30{ “key” : { “$binary” : “aGVsbG8gd29ybGQ=”, “$type” : “1” } }
正则表达式正则表达式50{ “key” : { “$regex” : “^张”, “$options” : “i” } }
对象嵌套 JSON 文档20{ “key” : { “subobj” : “value” } }
数组嵌套数组对象25{ “key” : [ “abc”, 0, “def” ] }
空值null5{ “key” : null }
最小值比所有值小-1{ “key” : {“$minKey”: 1 } }
最大值比所有值大127{ “key” : {“$maxKey”: 1 } }

Note:

不同类型字段的值进行比较时,比较优先级权值越大,该类型的值就越大。

高精度数类型

SequoiaDB 提供的高精度数可以满足银行等企业存储及运算高精度数据的需求。

取值范围

高精度数可确保小数点前最高 131072 位及小数点后最高 16383 位数字的精度。

格式

高精度数两种表达形式如下:

  1. 方式一:{ <fieldName> : { "$decimal" : "<数据>" } }
  2. 方式二:{ <fieldName> : { "$decimal" : "<数据>", "$precision" : [<总精度>, <小数精度>] } }

其中 “fieldName” 为数据的字段名;“数据”为字符串形式的数字;“总精度”为该数据整数部分及小数部分的精度范围的总和;“小数精度”为该数据小数部分的精度范围。

通过方式一定义的高精度数并没有指定精度范围,在这种情况下,数据默认使用最大的精度范围存储。通过方式二定义的高精度数同时指定了总精度和小数精度,数据将按照该精度要求存储。

使用高精度数由于需要确保精度不丢失,所以数据会占用更多的存储空间及花费更高的运算代价。用户可以参考 NumberDecimal 以了解高精度数的更多用法。

示例

  1. 使用高精度数表示 double 类型无法存储的数字:1.88888E+308

    1. { "num" : { "$decimal" : "1.88888E+308" } }
  2. 指定数据的精度

    1. { "pi" : { "$decimal" : "3.14179526", "$precision" : [ 20, 18 ] } }

对象 ID 类型

对象 ID 又称为 OID,它由 12 字节 16 进制字符构造而成。

取值范围

12 字节的字符包含如下内容:

  • 4 字节精确到秒的时间戳
  • 3 字节系统(物理机)标示
  • 2 字节线程 ID
  • 3 字节由随机数起始的序列号
4 字节时间戳3 字节系统标示2 字节线程ID3 字节序列号

一台机器的一个线程在一秒钟内最多可以生成 16777216 个不同的 OID 数值,因此基本可以认为在集群环境中,所有的 OID 数值都是全局唯一的。

在 SequoiaDB 中,每个集合存放的文档必须拥有一个 “_id” 字段。该字段的值类型为 OID 类型,并且该字段值在集合中唯一。

格式

对象 ID 的表达形式如下:

  1. { <fieldName> : { "$oid" : "<12字节16进制字符>" } }

用户可以参考 OID 以了解对象 ID 的更多用法。

示例

由 SequoiaDB 生成的对象 ID 的显示如下:

  1. { "_id" : { "$oid" : "5d1eea4d7e9eb6328c0c463e" } }

其中前 4 字节 16 进制字符 “5d1eea4d” 表示的时间戳为 1562307149,即为:2019-07-05 14:12:29;第 5 到第 7 字节 16 进制字符 “7e9eb6” 表示的机器标示为 8298166;第 8 到第 9 字节 16 进制字符 “328c” 表示的线程号为 12940;最后 3 字节 16 进制字符 “0c463e” 表示随机数 804414。

日期类型

SequoiaDB 中的日期使用 YYYY-MM-DD 的形式存取,在存储时将其转换为 8 字节的整数。

取值范围

日期类型的取值范围为:0000-01-01 至 9999-12-31。

格式

日期的表达形式如下:

  1. { <fieldName> : { "$date" : "<YYYY-MM-DD>" } }

用户可参考 SdbDate 了解日期类型的更多用法。

示例

  1. { "createTime" : { "$date" : "2012-05-12" } }

时间戳类型

SequoiaDB 中的时间戳使用 YYYY-MM-DD-HH.mm.ss.ffffff 的形式存取,在存储时将其转换为 8 字节的整数。

取值范围

时间戳类型的取值范围为:1902-01-01 00:00:00.000000 至 2037-12-31 23:59:59.999999。

格式

时间戳的表达形式如下:

  1. { <fieldName> : { "$timestamp" : "<YYYY-MM-DD-HH.mm.ss.ffffff>" } }

用户可参考 Timestamp 以了解时间戳类型的更多用法。

示例

  1. { "createTime" : { "$timestamp" : "2012-05-12-13.15.21.241523" } }

二进制类型

SequoiaDB 可以存储一定长度的二进制类型的数据。

取值范围

SequoiaDB 存储二进制类型的数据时,要求用户先使用 Base64 方式对二进制内容进行编码,然后将编码后的字符串存放到数据库。

格式

二进制数据的表达形式如下:

  1. { <fieldName> : { "$binary" : "<数据>", "$type" : <类型> } }

其中“数据”必须为 Base64 编码后的字符串,“类型”为 0-255 之间的十进制数值。用户可以任意指定该范围之间的数值作为应用程序中的类型标示。

Base64 为一种通用的数据转换形式,主要将二进制数据转化为以纯 ASCII 字符串表示的字节流。一般来说转换之后的数据长度会大于原本的数据长度。

为了节省空间,在 SequoiaDB 的内部存放数据时,会将 Base64 编码后的数据解码为原始数据进行存放。当用户读取数据时会再次将其转化为 Base64 形式发送。

Note:

BSON 最大能够装载 16MB 内容。当二进制内容太大时,可以考虑使用 Lob 来存放二进制内容。

用户可参考 BinData 以了解二进制数据类型的更多用法。

示例

字符串 “hello world” 被 Base64 编码后的数据为 aGVsbG8gd29ybGQ=。包含 “hello world” 二进制数据,且类型为 1 的 JSON 数据为:

  1. { "binary_data" : { "$binary" : "aGVsbG8gd29ybGQ=", "$type" : "1" } }

正则表达式类型

SequoiaDB 可以使用正则表达式检索用户数据。

取值范围

正则表达式规则,可参阅 Perl正则表达式手册

格式

正则表达式输入的格式如下:

  1. { <fieldName> : { "$regex" : "正则表达式", "$options" : "选项" } }

其中“正则表达式”为一个正则表达式字符串,“选项”则参见下表:

选项描述
i匹配时不区分大小写
m允许进行多行匹配;当该参数打开时,字符“^”与“&”匹配换行符之后的与之前的字符
x忽略正则表达式匹配中的空白字符;如果需要使用空白字符,在空白字符之前使用反斜线“\”进行转意
s允许“.”字符匹配换行符

当使用选项时,用户可以任意组合使用这些选项。

用户可以参考 Regex 以了解正则表达式类型的更多用法。

示例

使用正则表达式进行大小写忽略,匹配以字符“W”起始的字符串,可以使用:

  1. { "regex_data" : { "$regex" : "^W", "$options" : "i" } }

对象类型

在 SequoiaDB 的记录中,用户可以使用对象类型来表示嵌套结构。

取值范围

对象类型表示的嵌套结构可以包含一个或者多个任意的字段。

格式

对象由 “{“(左大括号)起始,至 “}”(右大括号)结束,其中包含至少一个键值对。

  1. { "fieldName" : { <字段1>, <字段2>, <字段n> } }

对象中各字段并没有固定的顺序,当对字段进行操作(如更新操作)时,字段之间的顺序可能会被调换。

当表示嵌套对象中的某一个字段时,可以使用 “.” (句号)在字段名之间分割。

示例

在记录中使用嵌套结构。例如:

  1. { "address" : { "city" : "Guangzhou", "street" : "Beijing Road" } }

可以使用 “address.city” 代表嵌套对象中的字段名 “city”。

数组类型

在 SequoiaDB 的记录中,当某一字段对应多个值时,用户可以使用数组结构存放数据。

取值范围

数组中的值可以为同一种类型,也可以为不同类型。值的数据类型可以为 JSON 支持的任意数据类型(包括嵌套对象和数组)。

格式

数组由“[”(左中括号)起始,至“]”(右中括号)结束,其中包含零个或多个值。

  1. { "fieldName" : [ <值0>, <值1>, <值n> ] }

数组中的值是有序的,每个值都存在下标。这些下标从 0 开始递增。在进行数据操作过程,数组中值的下标不会改变。在驱动中,用户可以通过下标的字符串来存取元素的值(即:下标的字符串为值对应的键)。

当访问数组中某个元素时,可以通过“字段名.下标”的方式来访问该元素。

示例

在数组中存放多种数据类型的元素。例如:

  1. { "array_data" : [ "hello", "world", 1, { "a" : 1, "b" : 2} ] }

其中 “hello” 在数组中的下标为 0,而 “world” 在数组中的下标为 1。如果希望表示 array_data 中 “world” 这个值时,可以使用 “array_data.1” 作为字段名。

JSON 实例与 SQL 实例数据类型映射关系

SequoiaDB 巨杉数据库采用存储与计算分离的模型。SequoiaDB 是数据存储层,存储真实的业务数据;而 SQL 实例(如:MySQL 实例,PostgreSQL 实例和SparkSQL 实例等 SQL 实例)为计算层。计算层的 SQL 实例只存储如 DDL 等元数据,而不会存储任何的业务数据。在数据类型层面,存储层的 JSON 实例与计算层的 SQL 实例存在以下映射关系:

类型JSON 实例MySQL 实例PostgreSQL 实例SparkSQL 实例
整数int32INT/BIT/
TINYINT/SMALLINT
smallint/integer/serialint
长整数int64INT/BIT/BIGINTbigint/bigserialbigint
浮点数doubleFLOAT/DOUBLEreal/double precisiondouble
高精度数decimalDECIMALnumeric/decimaldecimal
字符串stringCHAR/VARCHAR/
TINYTEXT/TEXT/
MEDIUMTEXT/
LONGTEXT
text/char/varcharstring
对象 IDObjectIdNANAstring
布尔booleanNAbooleanboolean
日期dateDATEdatedate
时间戳timestampTIMESTAMPtimestamptimestamp
二进制数据binaryBINARYbyteabinary
正则表达式regexNANANA
对象objectNANAstruct<field:type,…>
数组arrayNATYPE[]array<type>
空值nullNAtextNA
最小值maxNANANA
最大值minNANANA

关于 MySQL 实例与 JSON 实例数据类型映射的更详细情况,可参考MySQL 实例数据类型映射

关于 PostgreSQL 实例与 JSON 实例数据类型映射的更详细情况,可参考PostgreSQL 实例数据类型映射

关于 SparkSQL 实例与 JSON 实例数据类型映射的更详细情况,可参考SparkSQL 实例数据类型映射

其它参考

使用 Java 驱动构建 BSON 记录可参考 Java 驱动构建 BSON