Linguagem de definição relacional de documentos
Nesta página
A Linguagem de Definição Relacional do Documento (DRDL
) define uma exibição relacional de um esquema MongoDB.
mongodrdl
coleta amostras de documento de sua collection do MongoDB e deriva um arquivo DRDL
desses documento. mongosqld
então usa o esquema definido nos arquivos DRDL
para permitir que os clientes MySQL consultem seus dados do MongoDB.
Formato de arquivo
O DRDL
arquivo lista seus bancos de dados, tabelas e colunas no YAML formato.
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>
Exemplo
Documentos fornecidos da seguinte forma na coleção abc
no banco de dados test
:
{ "_id": ObjectId(), "close": 7.45, "detail": { "a": 2, "b": 3 } }
Execute mongodrdl
para gerar um esquema baseado nesta collection:
mongodrdl -d test -c abc -o schema.drdl
O arquivo de esquema gerado (schema.drdl
) parece semelhante ao seguinte:
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
Tipos de campo
O BI Connector mapeia campo que sempre contêm o mesmo tipo de dados no modelo relacional. A geração de esquemas lida especialmente com os seguintes casos:
Numérico | O BI Connector usa o tipo numérico mais preciso que corresponde ao documento de amostra. Se um campo em uma collection sempre tiver o mesmo tipo de dados, o BI Connector usará esse tipo. Se um campo em uma collection puder conter valores de ponto flutuante ou inteiros, o BI Connector usará o tipo |
Datas | |
Carimbos de data e hora | O Connector BI ignora qualquer campo do tipo data_timestamp . |
ObjectID | O BI Connector trata qualquer campo do tipo data_oid como o tipo SQL varchar . |
UUID | O BI Connector trata qualquer campo do tipo UUID como o tipo SQL varchar . |
Geoespacial | Se uma coleção contiver um índice geoespacial, o BI Connector o campo indexado em uma array de coordenadas numéricas de longitude-latitude. Consulte Dados geoespaciais para um exemplo. O BI Connector não reconhece campo geoespaciais ao ler de uma visualização. |
Campos heterogêneos | Se um campo contiver tipos inconsistentes, o BI Connector escolherá o tipo amostrado com mais frequência. Se um campo puder conter um tipo ou uma array desse tipo, o esquema gerado sempre especificará que o campo contém uma array. Para saber mais, consulte Como faço para ignorar dados incompatíveis com minha definição de tipo DRDL?. |
Documentos incorporados
O BI Connector mapeia documentos incorporados para campos simples que têm um caractere separador .
, fazendo-os parecer semelhante à maneira como você os referenciaria usando notação de ponto em uma query do MongoDB.
Enquanto o Tableau coloca aspas nos identificadores corretamente, dentro das expressões SQL ad-hoc você deve colocar aspas duplas em cada identificador que contenha .
caracteres ou caracteres mistos.
Exemplo
Considere o seguinte documento:
{ "_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") }
A execução mongodrdl
em uma collection que contém este documento resulta nos seguintes campos no esquema gerado:
_id | numeric |
familyName | varchar |
hometown | varchar |
address.street | varchar |
address.city | varchar |
address.state | varchar |
address.zip | varchar |
members_since | timestamp |
arrays
O BI Connector expõe arrays a ferramentas de business intelligence usando duas collections: uma sem a array e a outra com um documento por elemento da array.
Exemplo
Se você executar mongodrdl
em uma collection chamada families
que contém o seguinte documento:
{ "_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" } ] }] }
Isso resulta nas três tabelas a seguir:
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
Você pode unir essas tabelas para exibir os dados em um formato desnormalizado. Por exemplo, você pode listar as pessoas nomeadas no esquema acima junto com as informações de sua família usando a seguinte query:
SELECT f.*, m.`familyMembers.firstname` FROM families_familyMembers m JOIN families f ON m._id = f._id;
Pré-associação
Se você fornecer a opção --preJoined
para mongodrdl
, o BI Connector adicionará os campos no documento que o contém ao documento de cada elemento de array, "pré-unindo" a tabela.
No exemplo anterior, as tabelas conteriam as seguintes colunas adicionais:
families_familyMembers
familyName
varchar
hometown
varchar
families_familyMembers_attributes
familyMembers.age
numeric
familyMembers.firstname
varchar
familyMembers_idx
numeric
familyName
varchar
hometown
varchar
Filtros personalizados
Você pode adicionar uma coluna do tipo mongo.Filter
a uma coleção em seu arquivo DRDL
. Este tipo de coluna permite que você execute uma query $match personalizada.
Por exemplo, dado o esquema a seguir descrevendo uma cloud de ponto com até três componentes:
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
Você pode selecionar somente pontos tridimensionais utilizando a seguinte query:
SELECT x, y, z FROM points WHERE filter='{"z": {"$exists": true}}';
Aggregation Pipelines
Aggregation pipelines usando visualizações
O MongoDB 3.4 introduz visualizações somente leitura que você pode usar para filtrar dados incompatíveis.
Por exemplo, você pode criar uma view no reconhecimento de data center test
que contém apenas documento que contêm um número no campo grade
de uma collection grades
:
db.runCommand( { create: "numericGrades", viewOn: "grades", pipeline: [ { "$match": { "grade": { "$type": "number" } } } ] } )
Você pode então usar mongodrdl
para gerar um esquema a partir dessa visualização como faria com uma collection:
mongodrdl -d test -c numericGrades
Aggregation pipelines no DRDL
O BI Connector pode usar pipelines de agregação como parte do esquema para converter documentos da coleção ao formato adequado para as tabelas relacionais.
Por exemplo, considere um documento simples em uma coleção chamada simpleFamilies
:
{ "_id": 1, "familyName": "Partridge", "familyMembers" : [ "Shirley", "Keith", "Laurie"] }
mongodrdl
gera um esquema com as tabelas simpleFamilies
e simpleFamilies_familyMembers
.
A tabela simpleFamilies_familyMembers
enumera cada membro da família e tem o seguinte pipeline:
pipeline: - $unwind: includeArrayIndex: familyMembers_idx path: $familyMembers
Este pipeline utiliza $unwind
para criar um novo registro para cada membro do familyMembers
. O esquema rastreia o índice da array no campo familyMembers_idx
.
Dados geoespaciais
Se uma collection contiver um índice geoespacial 2d
ou 2dsphere
, o BI Connector mapeará o campo indexado em uma array de coordenadas numéricas de longitude-latitude.
Exemplo
Dada a seguinte collection:
db.points.createIndex( { pos : "2dsphere" } ) db.points.insertOne({ pos : { type: "Point", coordinates: [ -73.97, 40.77 ] }, name: "Central Park", category : "Parks" })
O BI Connector gera o seguinte esquema:
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[]
O BI Connector não reconhece campo geoespaciais ao ler de uma visualização.