本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
自动生成模式
Amazon DocumentDB 是一个文档数据库,因此没有表和架构的概念。但是,Tableau 之类的 BI 工具将希望它连接的数据库能够呈现模式。具体来说,当 JDBC 驱动程序连接需要获取数据库中集合的模式时,它将轮询数据库中的所有集合。驱动程序将确定该集合的模式的缓存版本是否已存在。如果缓存版本不存在,它将对文档的集合进行样本并根据以下行为创建架构。
模式生成限
DocumentDB JDBC 驱动程序将标识符的长度限制为 128 个字符。模式生成器可能会截断生成的标识符(表名和列名)的长度,以确保它们符合该限制。
扫描方法选项
可以使用连接字符串或数据源选项修改采样行为。
-
ScanMethod =<option>
-
random-(默认)-样本文档按随机顺序返回。
-
idForward-样本文件按照 ID 的顺序返回。
-
idReverse-样本文件按照 ID 的相反顺序返回。
-
所有-对集合中的所有文档进行样本。
-
-
ScanLimit=<n>-要抽样的文件数量。该值必须为正整数。默认值是 。1000. 如果扫描方法设置为所有将忽略此选项。
DocumentDB 数据类型
DocumentDB 服务器支持多种 MongoDB 数据类型。下面列出了受支持的数据类型及其关联的 JDBC 数据类型。
MongoDB 数据类型 | DocumentDB 支持 | JDBC 数据类型 |
---|---|---|
二进制数据 | 是 | VARBINARY |
Boolean | 是 | BOOLEAN |
Double | 是 | DOUBLE |
32 位整数 | 是 | INTEGER |
64 位整数 | 是 | BIGINT |
字符串 | 是 | VARCHAR |
ObjectId | 是 | VARCHAR |
日期 | 是 | TIMESTAMP |
Null | 是 | VARCHAR |
正则表达式 | 是 | VARCHAR |
时间戳 | 是 | VARCHAR |
MinKey | 是 | VARCHAR |
MaxKey | 是 | VARCHAR |
对象 | 是 | 虚拟表 |
数组 | 是 | 虚拟表 |
Decimal128 | 否 | DECIMAL |
JavaScript | 否 | VARCHAR |
JavaScript(带范围) | 否 | VARCHAR |
未定义 | 否 | VARCHAR |
符号 | 否 | VARCHAR |
dbPointer (4.0+) | 否 | VARCHAR |
映射标量文档字段
在从集合中扫描文档样本时,JDBC 驱动程序将创建一个或多个架构来表示集合中的样本。一般来说,文档中的标量字段映射到表架构中的列。例如,在名为团队的集合中和单个文档{ "_id" : "112233", "name" :
"Alastair", "age": 25 }
,这将映射到模式:
表名称 | 列名称 | 数据类型 | 密钥 |
---|---|---|---|
球队 | 团队 ID | VARCHAR | PK |
球队 | 名称 | VARCHAR | |
球队 | 年龄 | INTEGER |
数据类型冲突促销
扫描抽样文档时,字段的数据类型可能在文档之间不一致。在这种情况下,JDBC 驱动程序会将 JDBC 数据类型提升为适合采样文档中所有数据类型的通用数据类型。
例如:
{ "_id" : "112233", "name" : "Alastair", "age" : 25 } { "_id" : "112244", "name" : "Benjamin", "age" : "32" }
这些区域有:年龄字段在第一个文档中为 32 位整数,但在第二个文档中为字符串。在这里,JDBC 驱动程序将将 JDBC 数据类型提升为 VARCHAR,以便在遇到时处理任何一种数据类型。
表名称 | 列名称 | 数据类型 | 密钥 |
---|---|---|---|
球队 | 团队 ID | VARCHAR | PK |
球队 | 名称 | VARCHAR | |
球队 | 年龄 | VARCHAR |
Scalar-Scalar 冲突促销
下图显示了标量标量数据类型冲突的解决方法。

Scalar-复杂类型冲突促销
与标量类型冲突一样,不同文档中的同一字段在复数(数组和对象)和标量(整数、布尔值等)之间可能存在冲突的数据类型。对于这些领域,所有这些冲突都被解决(提升)到 VARCHAR。在这种情况下,数组和对象数据将作为 JSON 表示形式返回。
嵌入式数组-字符串字段冲突示例:
{ "_id":"112233", "name":"George Jackson", "subscriptions":[ "Vogue", "People", "USA Today" ] } { "_id":"112244", "name":"Joan Starr", "subscriptions":1 }
上面的示例映射到了 ustomer2 表的模式:
表名称 | 列名称 | 数据类型 | 密钥 |
---|---|---|---|
客户 2 | 客户 2 | VARCHAR | PK |
客户 2 | 名称 | VARCHAR | |
客户 2 | 订阅 | VARCHAR |
和 ustomer1_订阅虚拟表:
表名称 | 列名称 | 数据类型 | 密钥 |
---|---|---|---|
客户1_ 订阅 | 客户 1 | VARCHAR | PK/FK |
客户1_ 订阅 | 订阅 _index_lvl0 | BIGINT | PK |
客户1_ 订阅 | 值 | VARCHAR | |
客户_地址 | city | VARCHAR | |
客户_地址 | region | VARCHAR | |
客户_地址 | country | VARCHAR | |
客户_地址 | code | VARCHAR |
对象和数组数据类型处理
到目前为止,我们只描述了标量数据类型的映射方式。对象和数组数据类型(当前)映射到虚拟表。JDBC 驱动程序将创建一个虚拟表来表示文档中的对象或数组字段。映射的虚拟表的名称将连接原始集合的名称,后跟字段的名称,用下划线字符 (“_”) 分隔。
基表的主键 (“_id”) 在新虚拟表中使用新名称,并作为关联基表的外键提供。
对于嵌入式数组类型字段,将生成索引列以表示数组中每个级别的数组中的索引。
嵌入式对象字段示例
对于文档中的对象字段,JDBC 驱动程序创建虚拟表的映射。
{ "Collection: customer", "_id":"112233", "name":"George Jackson", "address":{ "address1":"123 Avenue Way", "address2":"Apt. 5", "city":"Hollywood", "region":"California", "country":"USA", "code":"90210" } }
上面的示例映射到客户表的架构:
表名称 | 列名称 | 数据类型 | 密钥 |
---|---|---|---|
顾客 | 客户 ID | VARCHAR | PK |
顾客 | 名称 | VARCHAR |
和 ustomer_address 虚拟表:
表名称 | 列名称 | 数据类型 | 密钥 |
---|---|---|---|
客户_地址 | 客户 ID | VARCHAR | PK/FK |
客户_地址 | 地址 1 | VARCHAR | |
客户_地址 | 地址 2 | VARCHAR | |
客户_地址 | city | VARCHAR | |
客户_地址 | region | VARCHAR | |
客户_地址 | country | VARCHAR | |
客户_地址 | code | VARCHAR |
嵌入式数组字段示例
对于文档中的数组字段,JDBC 驱动程序还会创建虚拟表的映射。
{ "Collection: customer1", "_id":"112233", "name":"George Jackson", "subscriptions":[ "Vogue", "People", "USA Today" ] }
上面的示例映射到了 customer1 表的模式:
表名称 | 列名称 | 数据类型 | 密钥 |
---|---|---|---|
客户 1 | 客户 1 | VARCHAR | PK |
客户 1 | 名称 | VARCHAR |
和 ustomer1_订阅虚拟表:
表名称 | 列名称 | 数据类型 | 密钥 |
---|---|---|---|
客户1_ 订阅 | 客户 1 | VARCHAR | PK/FK |
客户1_ 订阅 | 订阅 _index_lvl0 | BIGINT | PK |
客户1_ 订阅 | 值 | VARCHAR | |
客户_地址 | city | VARCHAR | |
客户_地址 | region | VARCHAR | |
客户_地址 | country | VARCHAR | |
客户_地址 | code | VARCHAR |