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
/ /

Definir la sintaxis del archivo de ruta

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.

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.

Puedes especificar una única función de análisis en el nombre de archivo.

/path/to/files/{<fieldA> <data-type>}

Puedes especificar varias funciones de análisis en el nombre del archivo.

/path/to/files/{<fieldA> <data-type>}-{<fieldB> <data-type>}

Puede especificar funciones de análisis junto con cadenas estáticas en el nombre del archivo:

/path/to/files/prefix-{<fieldA> <data-type>}-suffix

Puede especificar un punto (es decir, .) a lo largo de la ruta al nombre del archivo.

/path/to/files/{<fieldA>.<fieldB> <data-type>}

Puede especificar ObjectIds en la ruta a los archivos para crear particiones.

/path/to/files/{objid objectid}

Puedes especificar un rango de ObjectIds en la ruta de los archivos para crear las particiones.

/path/to/files/{min(obj) objectid}-{max(obj) objectid}

Puede especificar funciones de análisis en la ruta al nombre de archivo.

/path/{<fieldA> <data-type>}/{<fieldB> <data-type>}/{<fieldC> <data-type>}/*

Puedes especificar expresiones regulares para ISODate a lo largo de la ruta hasta el nombre de archivo.

/path/to/files/{<field-name> isodate("<date-format>"):\\<regex>}

Nota

Al path especificar:

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

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.

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

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 first coincide con 3 caracteres que no son dígitos y second coincide 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 first a 3 letras mayúsculas y second a 5 letras minúsculas.

Los siguientes ejemplos demuestran cómo analizar los nombres de archivos en campos calculados:

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.

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 invoiceNumber al analizar el primer segmento del nombre de archivo como una string.

  • Un campo invoiceDate al 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.

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 invoiceNumber analizando el primer segmento del nombre del archivo como una string

  • Un campo year usando 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 month mediante 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 day mediante 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 : 2019

  • month: 01

  • day: 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.

Tip

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.

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.

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.

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}}/*"
}
]
}
]
}
}

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.

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:

  • invoices

  • purchaseOrders

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.

Volver

Generar colecciones