文档关系定义语言
文档关系定义语言 ( DRDL
) 定义 MongoDB 模式的关系视图。
mongodrdl
对 MongoDB collection中的文档进行采样,并从这些文档中派生出DRDL
文件。然后, mongosqld
使用DRDL
文件中定义的模式允许 MySQL 客户端查询 MongoDB 数据。
文件格式
DRDL
文件列出了 YAML 格式的数据库、表和列 格式。
schema: - db: <database name> tables: - table: <SQL table name> collection: <MongoDB collection name> pipeline: - <optional pipeline elements> columns: - Name: <MongoDB field name> MongoType: <MongoDB field type> SqlName: <mapped SQL column name> SqlType: <mapped SQL column type>
例子
数据库 test
中的集合 abc
中以下形状的文档:
{ "_id": ObjectId(), "close": 7.45, "detail": { "a": 2, "b": 3 } }
运行mongodrdl
以根据此collection生成模式:
mongodrdl -d test -c abc -o schema.drdl
生成的模式文件 (schema.drdl
) 如下所示:
schema: - db: test tables: - table: abc collection: abc pipeline: [] columns: - Name: _id MongoType: bson.ObjectId SqlName: _id SqlType: varchar - Name: close MongoType: float64 SqlName: close SqlType: numeric - Name: detail.a MongoType: float64 SqlName: detail.a SqlType: numeric - Name: detail.b MongoType: float64 SqlName: detail.b SqlType: numeric
字段类型
BI Connector 将始终包含相同数据类型的字段映射到关系模型中。 模式生成专门处理以下情况:
数值 | BI Connector 使用与采样文档匹配的最精确的数字类型。 如果collection中的字段始终具有相同的数据类型,BI Connector 将使用该类型。 如果collection中的字段可以包含浮点值或整数,则 BI Connector 使用类型 |
日期 | |
时间戳 | BI Connector 会忽略任何类型为 data_timestamp 的字段。 |
ObjectID | BI Connector 将任何类型为 data_oid 的字段视为 SQL 类型varchar 。 |
UUID | BI Connector 将任何 UUID 类型的字段视为 SQL 类型 varchar 。 |
地理空间 | |
异构字段 | 如果字段包含不一致的类型,BI Connector 会选择最常采样的类型。 如果字段可以包含类型或该类型的数组,则生成的模式始终指定该字段包含数组。 要学习;了解详情,请参阅如何跳过与 DRDL 类型定义不兼容的数据?。 |
嵌入式文档
BI Connector 会将嵌入式文档映射到带有 .
分隔符的简单字段,使其与 MongoDB 查询中使用点表示法引用文档的方式类似。
虽然Tableau可以正确引用标识符,但在即席 SQL 表达式中,您必须用双引号包含每个包含.
字符或大小写混合字符的标识符。
例子
请考虑以下文档:
{ "_id": 1, "familyName": "Partridge", "hometown" : "Hollywood Hills", "address" : { "street": "123 Main Street", "city" : "Hollywood", "state" : "CA", "zip" : "90210" }, "members_since" : ISODate("2002-04-12T00:00:00Z") }
在包含此文档的collection上运行mongodrdl
会导致在生成的模式中出现以下字段:
_id | numeric |
familyName | varchar |
hometown | varchar |
address.street | varchar |
address.city | varchar |
address.state | varchar |
address.zip | varchar |
members_since | timestamp |
数组
BI Connector 使用两个collection向商业智能工具公开数组:一个没有数组,另一个每个数组元素有一个文档。
例子
如果您对名为families
的collection运行mongodrdl
,其中包含以下文档:
{ "_id": 1, "familyName": "Partridge", "hometown" : "Hollywood Hills", "familyMembers" : [ { "firstname" : "Shirley", "age" : 42, "attributes" : [ { "name" : "instrument", "value" : "singer" }, { "name" : "role", "value" : "mom" } ] }, { "firstname" : "Keith", "age" : 18, "attributes" : [ { "name" : "instrument", "value" : "guitar" }, { "name" : "role", "value" : "son" } ] }, { "firstname" : "Laurie", "age" : 16, "attributes" : [ { "name" : "instrument", "value" : "keyboard" }, { "name" : "role", "value" : "sister" } ] }] }
这会产生以下三个表:
families
_id
numeric
familyName
varchar
hometown
varchar
families_familyMembers
_id
numeric
familyMembers.age
numeric
familyMembers.firstname
varchar
familyMembers_idx
numeric
families_familyMembers_attributes
_id
numeric
familyMembers.attributes.name
varchar
familyMembers.attributes.value
varchar
familyMembers.attributes_idx
numeric
familyMembers_idx
numeric
您可以将这些表连接在一起,以查看非规范化格式的数据。 例如,您可以使用以下查询列出上述模式中的人员及其家庭信息:
SELECT f.*, m.`familyMembers.firstname` FROM families_familyMembers m JOIN families f ON m._id = f._id;
预连接
如果您为 提供 选项,BI Connector--preJoined
mongodrdl
会将包含的文档中的字段添加到每个数组元素的文档中,从而“预联接”该表。
在前面的示例中,这些表将包含以下附加列:
families_familyMembers
familyName
varchar
hometown
varchar
families_familyMembers_attributes
familyMembers.age
numeric
familyMembers.firstname
varchar
familyMembers_idx
numeric
familyName
varchar
hometown
varchar
自定义筛选器
您可以将类型为mongo.Filter
的列添加到DRDL
文件的集合中。 此列类型允许您执行自定义$match查询。
例如,给定以下模式描述最多包含三个组件的点云:
schema: - db: test tables: - table: points collection: points pipeline: [] columns: - Name: _id MongoType: bson.ObjectId SqlName: _id SqlType: varchar - Name: x MongoType: float64 SqlName: x SqlType: numeric - Name: "y" MongoType: float64 SqlName: "y" SqlType: numeric - Name: z MongoType: float64 SqlName: z SqlType: numeric - Name: filter MongoType: mongo.Filter SqlName: filter SqlType: varchar
您可以使用以下查询仅选择三维点:
SELECT x, y, z FROM points WHERE filter='{"z": {"$exists": true}}';
聚合管道
使用视图的聚合管道
MongoDB 3.4引入了只读视图,可用于筛选不兼容的数据。
例如,您可以在test
grade
数据库中创建一个视图,该视图仅包含包含collection的grades
字段中的数字的文档:
db.runCommand( { create: "numericGrades", viewOn: "grades", pipeline: [ { "$match": { "grade": { "$type": "number" } } } ] } )
然后,您可以使用mongodrdl
从该视图生成模式,就像生成collection一样:
mongodrdl -d test -c numericGrades
DRDL 中的聚合管道
BI Connector 可以使用聚合管道作为模式的一部分,将文档从集合转换为适合关系表的正确形式。
例如,考虑名为simpleFamilies
的collection中的一个简单文档:
{ "_id": 1, "familyName": "Partridge", "familyMembers" : [ "Shirley", "Keith", "Laurie"] }
mongodrdl
生成包含表simpleFamilies
和simpleFamilies_familyMembers
的模式。
表simpleFamilies_familyMembers
枚举了每个系列成员,并具有以下管道:
pipeline: - $unwind: includeArrayIndex: familyMembers_idx path: $familyMembers
此管道使用$unwind
为familyMembers
的每个成员创建一条新记录。 该模式跟踪字段familyMembers_idx
中的大量索引。
地理空间数据
如果集合包含2d
或2dsphere
地理空间索引,BI Connector 会将索引字段映射到数字经纬度坐标数组。
例子
给定以下collection:
db.points.createIndex( { pos : "2dsphere" } ) db.points.insertOne({ pos : { type: "Point", coordinates: [ -73.97, 40.77 ] }, name: "Central Park", category : "Parks" })
BI Connector 生成以下模式:
schema: - db: test tables: - table: points collection: points pipeline: [] columns: - Name: _id MongoType: bson.ObjectId SqlName: _id SqlType: varchar - Name: category MongoType: string SqlName: category SqlType: varchar - Name: name MongoType: string SqlName: name SqlType: varchar - Name: pos.coordinates MongoType: geo.2darray SqlName: pos.coordinates SqlType: numeric[]