Lenguaje de definición relacional de documentos (DRDL) define una vista relacional de un esquema 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 para generar un esquema basado en esta mongodrdl colección:
mongodrdl -d test -c abc -o schema.drdl
El archivo de esquema generado (schema.drdl) se parece 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 Campos
El Conector de BI asigna campos que siempre contienen el mismo tipo de datos al modelo relacional. La generación de esquemas se centra en 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 | |
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 Datos geoespaciales para ver un 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
BI Connector asigna documentos incrustados a campos simples que tienen un . carácter separador, lo que hace que parezcan similares a la forma en que haría referencia a ellos usando la notación de puntos en una consulta MongoDB.
Si bien Tableau cita correctamente los identificadores, dentro de las expresiones SQL ad-hoc debe escribir entre comillas dobles cada identificador que contenga . caracteres o caracteres con mayúsculas y minúsculas.
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") }
Al ejecutar en una colección que contiene este documento, se generan los siguientes campos en el esquema mongodrdl generado:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Arreglos
BI Connector expone matrices a herramientas de inteligencia empresarial utilizando dos colecciones: una sin la matriz y la otra con un documento por elemento de la matriz.
Ejemplo
Si ejecuta en una colección mongodrdl 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
Puede combinar estas tablas para ver los datos en un formato desnormalizado. Por ejemplo, puede listar las personas mencionadas en el esquema anterior junto con su información familiar mediante la siguiente consulta:
SELECT f.*, m.`familyMembers.firstname` FROM families_familyMembers m JOIN families f ON m._id = f._id;
Pre-unión
Si proporciona la --preJoined opción a, BI Connector agrega los campos del documento contenedor al documento de cada elemento de la matriz, "uniendo previamente" la mongodrdl tabla.
En el ejemplo anterior, las tablas contendrían las siguientes columnas adicionales:
families_familyMembersfamilyNamevarcharhometownvarcharfamilies_familyMembers_attributesfamilyMembers.agenumericfamilyMembers.firstnamevarcharfamilyMembers_idxnumericfamilyNamevarcharhometownvarchar
Filtros personalizados
Puede agregar una columna de tipo mongo.Filter a una colección en su DRDL archivo. Este tipo de columna le permite realizar una consulta $match 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
Puede seleccionar sólo puntos tridimensionales utilizando la siguiente consulta:
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, puede 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 puede usar mongodrdl para generar un esquema a partir de esta vista como lo haría con una colección:
mongodrdl -d test -c numericGrades
Canalizaciones de agregación en DRDL
BI Connector puede utilizar canales de agregación como parte del esquema para transformar documentos de la colección en el formato adecuado 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 simpleFamilies_familyMembersy.
La tabla simpleFamilies_familyMembers enumera cada miembro de la familia y tiene la siguiente secuencia:
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 2dsphere índice geoespacial o, BI Connector asigna el campo indexado a una matriz 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.