Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Lenguaje de definición relacional de documentos

Lenguaje de Definición Relacional de Documentos (DRDL) define una vista relacional de un esquema de MongoDB.

mongodrdl toma muestras de documentos de sus colecciones de MongoDB y deriva un DRDL archivo de esos documentos. luego utiliza el esquema definido enmongosqld los DRDL archivos para permitir que los clientes MySQL consulten sus datos de MongoDB.

El DRDL archivo enumera sus bases de datos, tablas y columnas en 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>

Dados documentos de la siguiente forma en la colección abc en la base de datos test:

{
"_id": ObjectId(),
"close": 7.45,
"detail": { "a": 2, "b": 3 }
}

Ejecute mongodrdl para generar un esquema basado en esta colección:

mongodrdl -d test -c abc -o schema.drdl

El archivo de esquema generado (schema.drdl) es similar al siguiente:

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 mapea campos que siempre contienen el mismo tipo de datos en el modelo relacional. La generación de esquemas se ocupa especialmente de los siguientes casos:

Numeric

BI Connector utiliza el tipo numérico más preciso que coincide con los documentos muestreados.

Si un campo de una colección siempre tiene el mismo tipo de datos, BI Connector utiliza ese tipo.

Si un campo de una colección puede contener valores de punto flotante o números enteros, BI Connector utiliza el tipo numeric.

Fechas

BI Connector trata cualquier campo de tipo data_date como de tipo SQL timestamp.

Marcas de tiempo

BI Connector ignora cualquier campo de tipo data_timestamp.

ObjectID

BI Connector trata cualquier campo de tipo data_oid como el tipo SQL varchar.

UUID

BI Connector trata cualquier campo de tipo UUID como el tipo SQL varchar.

Geoespacial

Si una colección contiene un índice geoespacial, BI Connector asigna el campo indexado a una matriz de coordenadas numéricas de longitud y latitud.

Consulte Geospatial Data como ejemplo.

BI Connector no reconoce los campos geoespaciales al leer de una vista.

Campos heterogéneos

Si un campo contiene tipos inconsistentes, BI Connector elige el tipo que se muestrea con mayor frecuencia.

Si un campo puede contener un tipo o una matriz de ese tipo, el esquema generado siempre especifica que el campo contiene una matriz.

Para obtener más información, consulte ¿Cómo puedo omitir datos incompatibles con mi definición de tipo DRDL?.

El BI Connector asigna documentos incrustados a campos simples que tienen un carácter separador ., haciéndolos aparecer similares a la forma en que los referiría utilizando la notación de puntos en una query de MongoDB.

Mientras que Tableau cita correctamente los identificadores, dentro de expresiones SQL ad-hoc se debe entrecomillar dos veces cada identificador que contenga . caracteres o caracteres en mayúsculas/minúsculas mezcladas.

Considere el siguiente 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")
}

Ejecutando mongodrdl en una colección que contiene este documento, se obtienen los siguientes campos en el esquema generado:

_id

numeric

familyName

varchar

hometown

varchar

address.street

varchar

address.city

varchar

address.state

varchar

address.zip

varchar

members_since

timestamp

BI Connector expone arreglos a las herramientas de business intelligence usando dos colecciones: una sin el arreglo y la otra teniendo un documento por cada elemento del arreglo.

Si ejecutas mongodrdl en una colección llamada families que contiene el siguiente 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" }
]
}]
}

Esto da como resultado las tres tablas siguientes:

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

Puedes unir estas tablas para ver los datos en un formato desnormalizado. Por ejemplo, puedes listar a las personas nombradas en el esquema anterior junto con su información familiar utilizando la siguiente query:

SELECT f.*, m.`familyMembers.firstname`
FROM families_familyMembers m
JOIN families f
ON m._id = f._id;

Si proporcionas la opción --preJoined a mongodrdl, el BI Connector agregará los campos del documento contenedor al documento de cada elemento del arreglo, "preuniendo" así la tabla.

En el ejemplo anterior, las tablas contendrían las siguientes columnas adicionales:

families_familyMembers

familyName

varchar

hometown

varchar

families_familyMembers_attributes

familyMembers.age

numeric

familyMembers.firstname

varchar

familyMembers_idx

numeric

familyName

varchar

hometown

varchar

Puedes añadir una columna del tipo mongo.Filter a una colección en tu archivo DRDL. Este tipo de columna le permite realizar una $match query personalizada.

Por ejemplo, dado el siguiente esquema que describe una nube de puntos con hasta tres 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

Solo puedes seleccionar puntos tridimensionales utilizando la siguiente query:

SELECT x, y, z
FROM points
WHERE filter='{"z": {"$exists": true}}';

MongoDB 3.4 presenta vistas de solo lectura que puede utilizar para filtrar datos incompatibles.

Por ejemplo, puedes crear una vista en la base de datos test que contenga solo documentos que contengan un número en el campo grade de una colección grades:

db.runCommand( { create: "numericGrades", viewOn: "grades", pipeline: [ { "$match": { "grade": { "$type": "number" } } } ] } )

Luego puedes usar mongodrdl para generar un esquema a partir de esta vista como lo harías con una colección:

mongodrdl -d test -c numericGrades

BI Connector puede usar pipelines de agregación como parte del esquema para transformar documentos de la colección en la forma adecuada para las tablas relacionales.

Por ejemplo, considera un documento simple en una colección llamada simpleFamilies:

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

mongodrdl genera un esquema con las tablas simpleFamilies y simpleFamilies_familyMembers.

La tabla simpleFamilies_familyMembers enumera cada miembro de la familia y tiene el siguiente pipeline:

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

Este pipeline utiliza $unwind para crear un nuevo registro para cada nodo de familyMembers. El esquema rastrea el índice del arreglo en el campo familyMembers_idx.

Si una colección contiene un 2d o 2dsphere Índice geoespacial, BI Connector mapea el campo indexado a un arreglo de coordenadas numéricas de longitud y latitud.

Dada la siguiente colección:

db.points.createIndex( { pos : "2dsphere" } )
db.points.insertOne({
pos : { type: "Point", coordinates: [ -73.97, 40.77 ] },
name: "Central Park",
category : "Parks"
})

BI Connector genera el siguiente 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[]

BI Connector no reconoce los campos geoespaciales al leer de una vista.

Volver

Configura TLS para BI Connector

En esta página