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 arquivo DRDL lista seus bancos de dados, tabelas e colunas no formato 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>
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 | O BI Connector trata qualquer campo do tipo |
Carimbos de data e hora | O Connector BI ignora qualquer campo do tipo |
ObjectID | O BI Connector trata qualquer campo do tipo |
UUID | O BI Connector trata qualquer campo do tipo UUID como o tipo SQL |
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:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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_idnumericfamilyNamevarcharhometownvarcharfamilies_familyMembers_idnumericfamilyMembers.agenumericfamilyMembers.firstnamevarcharfamilyMembers_idxnumericfamilies_familyMembers_attributes_idnumericfamilyMembers.attributes.namevarcharfamilyMembers.attributes.valuevarcharfamilyMembers.attributes_idxnumericfamilyMembers_idxnumeric
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_familyMembersfamilyNamevarcharhometownvarcharfamilies_familyMembers_attributesfamilyMembers.agenumericfamilyMembers.firstnamevarcharfamilyMembers_idxnumericfamilyNamevarcharhometownvarchar
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.