Menu Docs
Página inicial do Docs
/
BI Connector
/

Linguagem de definição relacional de documentos

Nesta página

  • Formato de arquivo
  • Tipos de campo
  • Documentos incorporados
  • Filtros personalizados
  • Aggregation Pipelines

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.

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>

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

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 numeric.

Datas
O BI Connector trata qualquer campo do tipo data_date como o tipo SQL timestamp .
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?.

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.

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

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.

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;

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

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}}';

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

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.

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.

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.

Voltar

Configurar TLS para BI Connector