SequoiaDB 巨杉数据库 JSON 实例支持的数据类型如下表所示:
值类型 | 定义 | 比较优先级权值 | 用例 |
---|---|---|---|
整数 | 范围:-2147483648~2147483647 | 10 | { "key" : 123 } |
长整数 | 范围:-9223372036854775808~9223372036854775807 如果用户指定的数值无法适用于整数,则 SequoiaDB 自动将其转化为浮点型 |
10 | { "key" : 3000000000 } 或{ "key" : { "$numberLong" : "3000000000" } } |
浮点数 | 范围:-1.7E+308~1.7E+308 | 10 | { "key" : 123.456 } 或{ "key" : 123e+50 } |
高精度数 | 范围:小数点前最高 131072 位,小数点后最高 16383 位 | 10 | { "key" : { $decimal:"123.456" } } |
字符串 | 双引号包含的字符串 | 15 | { "key" : "value" } |
对象 ID(OID) | 由十二字节字符构建而成 | 35 | { "key" : { "$oid" : "123abcd00ef12358902300ef" } } |
布尔 | true 或者 false | 40 | { "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" ] } |
空值 | null | 5 | { "key" : null } |
最小值 | 比所有值小 | -1 | { "key" : {"$minKey": 1 } } |
最大值 | 比所有值大 | 127 | { "key" : {"$maxKey": 1 } } |
Note:
- 不同类型字段的值进行比较时,比较优先级权值越大,该类型的值就越大。
- 日期和时间戳支持夏令时。
SequoiaDB 提供的高精度数可以满足银行等企业存储及运算高精度数据的需求。
高精度数可确保小数点前最高 131072 位及小数点后最高 16383 位数字的精度。
高精度数两种表达形式如下:
方式一:{ <fieldName> : { "$decimal" : "<数据>" } } 方式二:{ <fieldName> : { "$decimal" : "<数据>", "$precision" : [<总精度>, <小数精度>] } }
其中 fieldName 为数据的字段名;“数据”为字符串形式的数字;“总精度”为该数据整数部分及小数部分的精度范围的总和;“小数精度”为该数据小数部分的精度范围。
通过方式一定义的高精度数并没有指定精度范围,在这种情况下,数据默认使用最大的精度范围存储。通过方式二定义的高精度数同时指定了总精度和小数精度,数据将按照该精度要求存储。
由于使用高精度数需要确保精度不丢失,所以数据会占用更多的存储空间及花费更高的运算代价。
Note:
高精度数的更多用法可参考 NumberDecimal。
使用高精度数表示 double 类型无法存储的数字:1.88888E+308
{ "num" : { "$decimal" : "1.88888E+308" } }
指定数据的精度
{ "pi" : { "$decimal" : "3.14179526", "$precision" : [ 20, 18 ] } }
对象 ID 又称为 OID,由 12 字节 16 进制字符构造而成。
12 字节的字符包含如下内容:
4 字节时间戳 | 3 字节系统标示 | 2 字节线程ID | 3 字节序列号 |
---|
一台机器的一个线程在一秒钟内最多可以生成 16777216 个不同的 OID 数值,因此基本可以认为在集群环境中,所有的 OID 数值都是全局唯一的。
在 SequoiaDB 中,每个集合存放的文档必须拥有一个 _id 字段。该字段的值类型为 OID 类型,并且该字段值在集合中唯一。
对象 ID 的表达形式如下:
{ <fieldName> : { "$oid" : "<12字节16进制字符>" } }
Note:
对象 ID 的更多用法可参考 OID。
由 SequoiaDB 生成的对象 ID 的显示如下:
{ "_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。
日期的表达形式如下:
{ <fieldName> : { "$date" : "<YYYY-MM-DD>" } }
Note:
日期类型的更多用法可参考 SdbDate。
{ "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。
时间戳的表达形式如下:
{ <fieldName> : { "$timestamp" : "<YYYY-MM-DD-HH.mm.ss.ffffff>" } }
Note:
时间戳类型的更多用法可参考 Timestamp。
{ "createTime" : { "$timestamp" : "2012-05-12-13.15.21.241523" } }
SequoiaDB 可以存储一定长度的二进制类型的数据。
SequoiaDB 存储二进制类型的数据时,要求用户先使用 Base64 方式对二进制内容进行编码,然后将编码后的字符串存放到数据库。
二进制数据的表达形式如下:
{ <fieldName> : { "$binary" : "<数据>", "$type" : <类型> } }
其中“数据”必须为 Base64 编码后的字符串,“类型”为 0~255 之间的十进制数值。用户可以任意指定该范围之间的数值作为应用程序中的类型标识。
Base64 为一种通用的数据转换形式,主要将二进制数据转化为以纯 ASCII 字符串表示的字节流。一般来说转换之后的数据长度会大于原本的数据长度。
为了节省空间,在 SequoiaDB 的内部存放数据时,会将 Base64 编码后的数据解码为原始数据进行存放。当用户读取数据时会再次将其转化为 Base64 形式发送。
Note:
字符串"hello world"被 Base64 编码后的数据为"aGVsbG8gd29ybGQ="。包含"hello world"二进制数据,且类型为 1 的 JSON 数据为:
{ "binary_data" : { "$binary" : "aGVsbG8gd29ybGQ=", "$type" : "1" } }
SequoiaDB 可以使用正则表达式检索用户数据。
正则表达式规则,可参阅 Perl 正则表达式手册。
正则表达式输入的格式如下:
{ <fieldName> : { "$regex" : "正则表达式", "$options" : "选项" } }
其中“正则表达式”为一个正则表达式字符串,“选项”则参见下表:
选项 | 描述 |
---|---|
i | 匹配时不区分大小写 |
m | 允许进行多行匹配;当该参数打开时,字符“^”与“&”匹配换行符之后的与之前的字符 |
x | 忽略正则表达式匹配中的空白字符;如果需要使用空白字符,在空白字符之前使用反斜线“\”进行转意 |
s | 允许“.”字符匹配换行符 |
当使用选项时,用户可以任意组合使用这些选项。
Note:
正则表达式类型的更多用法可参考 Regex。
使用正则表达式进行大小写忽略,匹配以字符“W”起始的字符串,可以使用:
{ "regex_data" : { "$regex" : "^W", "$options" : "i" } }
在 SequoiaDB 的记录中,用户可以使用对象类型来表示嵌套结构。
对象类型表示的嵌套结构可以包含一个或者多个任意的字段。
对象由"{"(左大括号)起始,至 "}"(右大括号)结束,其中包含至少一个键值对。
{ "fieldName" : { <字段1>, <字段2>, <字段n> } }
对象中各字段并没有固定的顺序,当对字段进行操作(如更新操作)时,字段之间的顺序可能会被调换。当表示嵌套对象中的某一个字段时,可以使用 "." (句号)在字段名之间分割。
在记录中使用嵌套结构,例如:
{ "address" : { "city" : "Guangzhou", "street" : "Beijing Road" } }
用户可以使用 "address.city" 代表嵌套对象中的字段名 "city"。
在 SequoiaDB 的记录中,当某一字段对应多个值时,用户可以使用数组结构存放数据。
数组中的值可以为同一种类型,也可以为不同类型。值的数据类型可以为 JSON 支持的任意数据类型(包括嵌套对象和数组)。
数组由“[”(左中括号)起始,至“]”(右中括号)结束,其中包含零个或多个值。
{ "fieldName" : [ <值0>, <值1>, <值n> ] }
数组中的值是有序的,每个值都存在下标,且下标从 0 开始递增。在进行数据操作过程,数组中值的下标不会改变。在驱动中,用户可以通过下标的字符串来存取元素的值(即:下标的字符串为值对应的键)。
当访问数组中某个元素时,可以通过“字段名.下标”的方式来访问该元素。
在数组中存放多种数据类型的元素,例如:
{ "array_data" : [ "hello", "world", 1, { "a" : 1, "b" : 2} ] }
其中"hello"在数组中的下标为 0,而"world"在数组中的下标为 1。如果希望表示 array_data 中"world"这个值时,可以使用"array_data.1"作为字段名。
如果用户需要使用 Java 驱动构建 BSON 记录可参考 Java 驱动构建 BSON。