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.
Formato de archivo
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>
Ejemplo
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
tipos de campo
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 |
Fechas | BI Connector trata cualquier campo de tipo |
Marcas de tiempo | BI Connector ignora cualquier campo de tipo |
ObjectID | BI Connector trata cualquier campo de tipo |
UUID | BI Connector trata cualquier campo de tipo UUID como el tipo SQL |
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?. |
Documentos incrustados
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.
Ejemplo
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:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Arreglos
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.
Ejemplo
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_idnumericfamilyNamevarcharhometownvarcharfamilies_familyMembers_idnumericfamilyMembers.agenumericfamilyMembers.firstnamevarcharfamilyMembers_idxnumericfamilies_familyMembers_attributes_idnumericfamilyMembers.attributes.namevarcharfamilyMembers.attributes.valuevarcharfamilyMembers.attributes_idxnumericfamilyMembers_idxnumeric
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;
Pre adhesión
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_familyMembersfamilyNamevarcharhometownvarcharfamilies_familyMembers_attributesfamilyMembers.agenumericfamilyMembers.firstnamevarcharfamilyMembers_idxnumericfamilyNamevarcharhometownvarchar
Filtros personalizados
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}}';
Pipeline de agregación
Pipeline de agregación usando vistas
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
Canalizaciones de agregación en DRDL
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.
Datos geoespaciales
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.
Ejemplo
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.