Nota
Para simplificar la documentación, los ejemplos que se encuentran en esta página se basan en almacenes de datos en AWS S,3 sin embargo, también se aplican a Google Cloud y Azure Private Link.
Overview
Cuando consulta documentos en su almacén de datos, Atlas Data Federation
path
value permite que Data Federation asocie los datos dentro de tu documento al nombre del archivo del documento.
path
admite analizar nombres de archivos en sus almacenes de datos en campos calculados. Data Federation puede agregar los campos calculados a cada documento generado a partir del archivo analizado. Data Federation puede dirigir las queries sobre esos valores de campos calculados solo a aquellos archivos con un nombre de archivo coincidente. Ver Funciones de análisis admitidas y Ejemplos para obtener más información.
path
también admite la creación de particiones utilizando atributos de partición en la ruta al archivo. La Data Federation puede aplicar queries sobre el parámetro definido en el atributo de partición únicamente a aquellos archivos que contengan la query en el nombre del archivo o en el prefijo de la partición.
Ejemplo
Considera los siguientes archivos en tu bucket S3:
/users/26/1234.json /users/26/5678.json
El documento JSON 1234.json contiene lo siguiente:
{ "name": "jane doe", "age": 26, "userID": "1234" }
la configuración de tu instancia federada de base de datos para los archivos en tu S3 bucket define lo siguiente path:
"path": "/users/{age int}/{userID string}"
A continuación se muestra cómo Data Federation asigna una consulta a las particiones creadas a partir de la definición path:
db.users.findOne( /users { /40 "age": 26 -----------------> /26 "userID": "1234" ----------> /1234.json } /5678.json )
Si el campo calculado para el atributo de partición ya existe en tu documento, Data Federation asigna tu query al archivo correspondiente. Si el campo calculado no existe, Data Federation añade el campo calculado al documento. Por ejemplo, si el campo age no existe en 1234.json, Data Federation agregará el campo age y el valor a 1234.json.
Funciones de análisis compatibles
Puedes especificar una única función de análisis en el nombre de archivo. | | |
Puedes especificar varias funciones de análisis en el nombre del archivo. | | |
Puede especificar funciones de análisis junto con cadenas estáticas en el nombre del archivo: | | |
Puede especificar un punto (es decir, | | |
Puede especificar | | |
Puedes especificar un rango de | | |
Puede especificar funciones de análisis en la ruta al nombre de archivo. | | |
Puedes especificar expresiones regulares para | |
Nota
Especifica el tipo de dato para el atributo de partición.
Asegúrate de que el tipo de atributo de partición coincida con el tipo de dato a analizar.
Utiliza el delimitador especificado en
delimiter.
Cuando se especifican atributos del mismo tipo, realizar cualquiera de las siguientes acciones:
Agregue un separador constante entre los atributos.
Utiliza expresiones regulares para describir el patrón de búsqueda. Para obtener más información, consulte Funciones de análisis no admitidas.
Análisis de valores nulos a partir de nombres de archivos
Data Federation analiza automáticamente una cadena vacía ("") en el lugar de un atributo en la ruta del archivo como el valor null BSON para todos los tipos de atributos de Atlas Data Federation excepto string. Con un string, una string vacía podría representar un valor null BSON o un valor de string vacía BSON. Atlas Data Federation no analiza ningún valor BSON para string tipo de atributo. Esto evita añadir un valor BSON con un tipo conflictivo a los documentos leídos desde tu almacén de datos.
Ejemplo
Considera el siguiente almacén de instancia federada de base de datos S3:
/records/january/1.json /records/february/1.json /records//1.json For the path ``/records/{month string}/*``, Data Federation does not add any computed fields for the ``month`` attribute to documents generated from the third record in the above store.
Nota
Cuando guardes archivos en S3, escribe los valores nulos de BSON como cadenas vacías en los nombres de archivo para todos los tipos de atributos de Atlas Data Federation.
Análisis de Números Rellenos en Nombres de Archivos
La ruta del archivo puede incluir valores numéricos que estén rellenados con ceros a la izquierda. Para que Data Federation analice correctamente los valores numéricos con relleno para tipos de atributos como int, epoch_millis y epoch_secs, especifica el número de dígitos en el valor utilizando expresiones regulares.
Ejemplo
Considera una tienda S3 con los siguientes archivos:
|--users |--001.json |--002.json ...
La siguiente sintaxis path utiliza una expresión regular para especificar el número de dígitos en el nombre del archivo. Data Federation identifica la parte de la ruta que corresponde al atributo de partición y luego asigna ese atributo de partición a un tipo int:
/users/{user_id int:\\d{3}}
Funciones de parsing no compatibles
Especificar funciones de análisis consecutivas en el mismo nombre de archivo sin ninguna forma de diferenciarlas podría conducir a resultados inconsistentes.
Ejemplo
Considera una tienda S3 con los siguientes archivos:
|--food |--icecream |--peanutbutter
Ahora considere la siguiente ruta a los archivos en el directorio food:
/food/{first string}{second string}/
No hay forma de determinar qué parte de la subcadena del nombre de archivo debe coincidir con el first string frente al second string. Por lo tanto, Atlas Data Federation iguala todo a first.
Considere utilizar atributos con expresiones regulares similares a las siguientes:
/food/{first string:\\D{3}}{second string:\\D{5}} La ruta anterior especifica que
firstcoincide con 3 caracteres que no son dígitos ysecondcoincide con los siguientes 5 caracteres que no son dígitos./food/{first string:[A-Z]{3}}{second string:[a-z]{5}} La ruta anterior coincide con
firsta 3 letras mayúsculas yseconda 5 letras minúsculas.
Ejemplos
Los siguientes ejemplos demuestran cómo analizar los nombres de archivos en campos calculados:
Utilizar una expresión regular para analizar campos desde el nombre del archivo.
Identificar rangos de datos consultables a partir del nombre de archivo
Generar nombres de colecciones dinámicas a partir de la ruta del archivo
Analizar campo único desde nombre de archivo
Considera un almacén de instancia federada de base de datos accountingArchive que contiene archivos donde el nombre del archivo describe una fecha de factura. Por ejemplo, el nombre de archivo /invoices/1564671291998.json contiene las facturas para la marca temporal UNIX 1564671291998.
El siguiente objeto databases genera un campo invoiceDate al analizar el nombre de archivo como una marca de tiempo UNIX:
"databases" : [ { "name" : "accounting", "collections" : [ { "name" : "invoices", "dataSources" : [ { "storeName" : "accountingArchive", "path" : "/invoices/{invoiceDate epoch_millis}" } ] } ] } ]
Data Federation añade el campo calculado y el valor a cada documento generado a partir del nombre del archivo. Los documentos generados a partir del nombre de archivo de ejemplo incluyen un campo invoiceDate: ISODate("2019-08-01T14:54:51Z"). Las consultas en el campo invoiceDate pueden dirigirse únicamente a aquellos archivos que coincidan con el valor especificado.
Analizar varios campos a partir del nombre de archivo
Considere un almacén de instancia federada de base de datos accountingArchive que contenga archivos donde el nombre del archivo describa un número de factura y la fecha de la factura. Por ejemplo, el nombre de archivo /invoices/MONGO12345-1564671291998.json contiene la factura MONGODB12345 para la marca de tiempo UNIX 1564671291998.
El siguiente databases objeto genera:
Un campo
invoiceNumberal analizar el primer segmento del nombre de archivo como una string.Un campo
invoiceDateal analizar el segundo segmento del nombre del archivo como una marca de tiempo UNIX.
"databases" : [ { "name": "accounting", "collections" : [ { "name" : "invoices", "dataSources" : [ { "storeName" : "accountingArchive", "path" : "/invoices/{invoiceNumber string}-{invoiceDate epoch_millis}" } ] } ] } ]
La federación de datos agrega los campos y valores calculados a cada documento generado a partir del nombre de archivo. Los documentos generados a partir del nombre de archivo de ejemplo incluyen los siguientes campos:
invoiceNumber : "MONGODB12345"invoiceDate : ISODate("2019-08-01T14:54:51Z")
Las consultas que incluyan tanto los campos invoiceNumber y invoiceDate se pueden orientar solo a los archivos que coincidan con los valores especificados.
Utilizar una expresión regular para analizar campos desde el nombre del archivo.
Considere un almacén de instancia federada de base de datos accountingArchive que contenga archivos donde el nombre del archivo describa un número de factura y la fecha de la factura. Por ejemplo, el nombre del archivo /invoices/MONGODB12345-20190102.json contiene la factura MONGODB12345 para la fecha 20190102.
El siguiente databases objeto genera:
Un campo
invoiceNumberanalizando el primer segmento del nombre del archivo como una stringUn campo
yearusando una expresión regular para analizar solo los primeros 4 dígitos del segundo segmento del nombre de archivo como un número entero.Un campo
monthmediante el uso de una expresión regular para analizar solo los 2 dígitos siguientes del segundo segmento del nombre de archivo como un número entero.Un campo
daymediante el uso de una expresión regular para analizar solo los 2 dígitos siguientes del segundo segmento del nombre de archivo como un número entero.
"databases" : [ { "name" : "accounting", "collections" : [ { "name" : "invoices", "dataSources" : [ { "storeName" : "accountingArchive", "path" : "/invoices/{invoiceNumber string}-{year int:\\d{4}}{month int:\\d{2}}{day int:\\d{2}}" } ] } ] } ]
La federación de datos agrega los campos y valores calculados a cada documento generado a partir del nombre de archivo. Los documentos generados a partir del nombre de archivo de ejemplo incluyen los siguientes campos:
invoiceNumber : "MONGODB12345"year : 2019month: 01day: 02
Importante
Debes escapar la cadena de expresiones regulares especificada path en. Por ejemplo, si la cadena incluye comillas dobles, debes escapar esos valores. La Federación de Datos admite la sintaxis de paquete. para expresiones regulares en la configuración de almacenamiento.
Las consultas que incluyen todos los campos generados se pueden orientar únicamente a aquellos archivos que coincidan con los valores especificados.
Identificar rangos de datos consultables a partir del nombre de archivo
Considera un almacén de instancia federada de base de datos accountingArchive que contiene archivos donde el nombre del archivo describe el rango de datos contenidos en el archivo. Por ejemplo, el nombre de archivo /invoices/1546367712000-1549046112000.json contiene facturas del periodo entre 2019-01-01 y 2019-01-02, con el rango de fechas representado como los milisegundos transcurridos desde la Unix epoch.
El siguiente objeto databases identifica el rango de tiempo mínimo como el primer segmento del nombre del archivo y el rango de tiempo máximo como el segundo segmento del nombre del archivo:
"databases" : [ { "name: "accounting", "collections" : [ { "name: "invoices", "dataSources" : [ { "storeName" : "accountingArchive", "path" : "/invoices/{min(invoiceDate) epoch_millis}-{max(invoiceDate) epoch_millis}" } ] } ] } ]
Cuando Data Federation recibe una consulta en el campo "invoiceDate", utiliza la ruta especificada para identificar qué archivos contienen los datos que coinciden con la consulta.
Las consultas en el campo invoiceDate se pueden dirigir únicamente a aquellos archivos cuyo rango capture el valor especificado, incluidas las fechas min y max.
Importante
El campo especificado para los rangos mínimo y máximo debe existir en cada documento contenido en el archivo para evitar comportamientos inesperados o indeseados. La Federación de Datos no realiza ninguna validación de que los datos subyacentes cumplan con esta restricción.
Identifica campos anidados a partir del nombre del archivo
Data Federation permite consultar datos anidados cuando el valor de los datos anidados también es el nombre del archivo. Se puede utilizar el operador de punto (es decir, .) en su path para asignar los atributos de particiones en su configuración de almacenamiento a campos anidados en sus documentos.
Considera una instancia federada de base de datos instancia de almacenamiento accountingArchive. La instancia federada de base de datos contiene archivos cuyos nombres coinciden con los valores de los campos anidados en los documentos. Por ejemplo:
accountingArchive |--invoices |--January.json |--February.json ...
Suponga que el archivo January.json contiene un documento con los siguientes campos:
{ "invoice": { "invoiceNumber" : "MONGODB12345", "year" : 2019, "month": "January", //value matches filename "date": 02 }, "vendor": "MONGODB", ... }
El siguiente objeto databases identifica month como un campo anidado dentro de un documento. El objeto también identifica el valor databases de month como el nombre del archivo que contiene el documento.
"databases" : [ { "name" : "accounting", "collections" : [ { "name" : "invoices", "dataSources" : [ { "storeName" : "accountingArchive", "path" : "/invoices/{invoice.month string}" } ] } ] } ]
Cuando Atlas Data Federation recibe una consulta sobre un mes específico, como January, utiliza la ruta especificada para identificar qué archivo contiene los datos que coinciden con la consulta.
Crear particiones a partir de ObjectIds
Puedes especificar ObjectIds en la ruta a los archivos. Para los archivos que contienen ObjectId en el nombre del archivo, Atlas Data Federation crea particiones para cada ObjectId.
Considere el siguiente almacén de instancia federada de base de datos, accountingArchive. Esta almacén de datos contiene archivos que incluyen ObjectId en el nombre del archivo:
accountingArchive |--invoices |--507f1f77bcf86cd799439011.json |--507f1f77bcf86cd799439012.json |--507f1f77bcf86cd799439013.json |--507f1f77bcf86cd799439014.json |--507f1f77bcf86cd799439015.json
El siguiente objeto databases crea particiones para el ObjectIds.
"databases" : [ { "name" : "accounting", "collections" : [ { "name" : "invoices", "dataSources" : [ { "storeName" : "accountingArchive", "path" : "/invoices/{objid objectid}" } ] } ] } ]
O bien, supongamos que el almacén de instancias de base de datos federada accountingArchive contiene archivos cuyo nombre incluye un rango de ObjectIds. Por ejemplo:
accountingArchive |--invoices |--507f1f77bcf86cd799439011-507f1f77bcf86cd799439020.json |--507f1f77bcf86cd799439021-507f1f77bcf86cd799439030.json |--507f1f77bcf86cd799439031-507f1f77bcf86cd799439040.json
El siguiente objeto crea particiones para el rango databases dado ObjectIds de.
"databases" : [ { "name" : "accounting", "collections" : [ { "name" : "invoices", "dataSources" : [ { "storeName" : "accountingArchive", "path" : "/invoices/{min(obj) objectid}-{max(obj) objectid}" } ] } ] } ]
Cuando Data Federation recibe una consulta en la ObjectId, utiliza la ruta especificada para identificar qué archivo contiene los datos que coinciden con la consulta.
Crear particiones a partir de la ruta del archivo
Se pueden especificar funciones de análisis en cualquier ruta previa al nombre de archivo. Cada campo computado se basa en una función de análisis a lo largo de la ruta. Al consultar los datos, Atlas Data Federation convierte cada campo computado en una partición. Las particiones, que son sinónimos de subdirectorios, se utilizan luego para filtrar archivos con mayor precisión.
Considere un almacén de instancia federada de base de datos accountingArchive con la siguiente estructura de directorios:
invoices |--MONGO12345 |--2019 |--01 |--02
El siguiente objeto crea databases las invoiceNumber yearmonthparticiones,, y day con un pequeño conjunto de archivos filtrados:
"databases" : [ { "name" : "accounting", "collections" : [ { "name" : "invoices", "dataSources" : [ { "storeName" : "accountingArchive", "path" : "/invoices/{invoiceNumber string}/{year int}/{month int:\\d{2}}/{day int:\\d{2}}/*" } ] } ] } }
Crear particiones desde ISODate
Puede especificar ISODate en la ruta de los archivos. Para los archivos que contienen ISODate en el nombre, Atlas Data Federation crea particiones para ISODate cada.
Considere el siguiente almacén de instancia federada de base de datos, accountingArchive. Esta almacén de datos contiene archivos que incluyen ISODate en el nombre del archivo:
accountingArchive |--invoices |--01_02_2022_2301.json |--02_02_2022_2301.json |--03_02_2022_2301.json |--04_02_2022_2301.json |--05_02_2022_2301.json
El siguiente objeto crea particiones databases para.ISODate muestra path cómo usar expresiones regulares para el formato de fecha si esta no está en formato 3339 RFC.
"databases" : [ { "name" : "accounting", "collections" : [ { "name" : "invoices", "dataSources" : [ { "storeName" : "accountingArchive", "path" : "/invoices/creationDate isodate('01_02_2006_1504'):\\d{2}_\\d{2}_\\d{4}_\\d{4}.json" } ] } ] } ]
Para obtener más información sobre otros formatos admitidos, consulte Usar tipos de atributos de partición.
Generar nombres de colecciones dinámicas a partir de la ruta del archivo
Considere un almacén de instancia federada de base de datos accountingArchive con la siguiente estructura de directorios:
invoices |--SuperSoftware |--UltraSoftware |--MegaSoftware
El siguiente objeto databases genera un nombre de colección dinámico a partir de la ruta del archivo:
"databases" : [ { "name" : "invoices", "collections" : [ { "name" : "*", "dataSources" : [ { "storeName" : "accountingArchive", "path" : "/invoices/{collectionName()}/" } ] } ] } ]
Cuando se aplica a la estructura de directorios de ejemplo, la ruta da como resultado las siguientes colecciones:
SuperSoftware
UltraSoftware
MegaSoftware
O bien, considere un almacén de instancia federada de base de datos accountingArchive con los siguientes archivos:
/orders/MONGODB/invoices/January.json /orders/MONGODB/purchaseOrders/January.json /orders/MONGODB/invoices/February.json ...
El siguiente objeto databases genera un nombre de colección dinámico a partir de la ruta del archivo:
"databases" : [ { "name" : "invoices", "collections" : [ { "name" : "*", "dataSources" : [ { "storeName" : "accountingArchive", "path" : "/orders/MONGODB/{collectionName()}/{invoiceMonth string}.json/" } ] } ] } ]
Al aplicarse a los nombres de archivos de ejemplo, la ruta da como resultado las siguientes colecciones:
invoicespurchaseOrders
Nota
Cuando se generan colecciones dinámicamente a partir de nombres de archivos, la cantidad de colecciones no se informa con precisión en el Data Federation vista.