Docs 菜单
Docs 主页
/
BI Connector
/

文档关系定义语言

在此页面上

  • 文件格式
  • 字段类型
  • 嵌入式文档
  • 自定义筛选器
  • 聚合管道

文档关系定义语言 ( 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 使用类型numeric

日期
BI Connector将任何类型为data_date的字段视为SQL timestamp类型。
时间戳
BI Connector 会忽略任何类型为data_timestamp的字段。
ObjectID
BI Connector 将任何类型为data_oid的字段视为 SQL 类型varchar
UUID
BI Connector 将任何 UUID 类型的字段视为 SQL 类型varchar
地理空间

如果集合包含地理空间索引,BI Connector 会将索引字段映射到数值经纬度坐标数组中。

有关示例,请参阅地理空间数据

视图读取数据时,BI Connector 无法识别地理空间字段。

异构字段

如果字段包含不一致的类型,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

BI Connector 可以使用聚合管道作为模式的一部分,将文档从集合转换为适合关系表的正确形式。

例如,考虑名为simpleFamilies的collection中的一个简单文档:

{
"_id": 1,
"familyName": "Partridge",
"familyMembers" : [ "Shirley", "Keith", "Laurie"]
}

mongodrdl生成包含表simpleFamiliessimpleFamilies_familyMembers的模式。

simpleFamilies_familyMembers枚举了每个系列成员,并具有以下管道:

pipeline:
- $unwind:
includeArrayIndex: familyMembers_idx
path: $familyMembers

此管道使用$unwindfamilyMembers的每个成员创建一条新记录。 该模式跟踪字段familyMembers_idx中的大量索引。

如果集合包含2d2dsphere地理空间索引,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[]

视图读取数据时,BI Connector 无法识别地理空间字段。

后退

为 BI Connector 配置 TLS