Docs Menu
Docs Home
/ /

GridFS para implementaciones autogestionadas

GridFS es una especificación para almacenar y recuperar archivos que superan el límite de tamaño de documentos BSON de 16 MiB.

Nota

En lugar de almacenar un archivo en un solo documento, GridFS divide el archivo en partes, o fragmentos [1], y almacena cada fragmento como un documento independiente. Por defecto, GridFS utiliza un tamaño de fragmento de 255 KiB; es decir, GridFS divide un archivo en fragmentos de 255 KiB, con la excepción del último fragmento. El último fragmento es tan grande como sea necesario. De manera similar, los archivos que no son más grandes que el tamaño del fragmento solo tienen un fragmento final, y utilizan solo el espacio necesario más algunos metadatos adicionales.

GridFS utiliza dos colecciones para almacenar archivos. Una colección almacena los fragmentos de archivos y la otra, sus metadatos. La sección Colecciones GridFS describe cada colección en detalle.

Cuando realice una query GridFS para un archivo, el controlador reensamblará los fragmentos según sea necesario. Puede realizar consultas de rango en archivos almacenados a través de GridFS. También puede acceder a información de secciones arbitrarias de archivos, como para "saltar" al medio de un archivo de video o audio.

GridFS es útil no solo para almacenar archivos que superan los 16 MiB, sino también para almacenar cualquier archivo al que desee acceder sin tener que cargar el archivo completo en la memoria. Véase también Cuándo usar GridFS.

En MongoDB, utilice GridFS para almacenar archivos superiores a 16 MiB.

En algunas situaciones, puede ser más eficiente almacenar archivos grandes en una base de datos MongoDB que en un sistema de archivos a nivel de sistema.

No utilices GridFS si necesitas actualizar el contenido de todo el archivo de manera atómica. Como alternativa, puedes almacenar múltiples versiones de cada archivo y especificar la versión actual del archivo en los metadatos. Puedes actualizar el campo de metadatos que indica el estado "más reciente" en una actualización atómica después de cargar la nueva versión del archivo y luego remover las versiones anteriores si es necesario.

Además, si todos sus archivos son más pequeños que el límite de tamaño de documento BSON de 16 MiB, considere almacenar cada archivo en un solo documento en lugar de utilizar GridFS. Puede utilizar el tipo de datos BinData para almacenar los datos binarios. Consulte la documentación de sus drivers para obtener más detalles sobre el uso de BinData.

Para almacenar y recuperar archivos usando GridFS, utilice cualquiera de los siguientes:

  • Un driver de MongoDB. Se debe consultar la documentación de los drivers para obtener información sobre el uso de GridFS con el driver.

  • La mongofiles herramienta de línea de comandos. Consulte la mongofiles referencia para la documentación.

GridFS almacena archivos en dos colecciones:

GridFS coloca las colecciones en un depósito común y les antepone el nombre del bucket. Por defecto, GridFS utiliza dos colecciones con un bucket llamado fs:

  • fs.files

  • fs.chunks

Puede elegir un nombre de bucket diferente, así como crear múltiples buckets en una sola base de datos. El nombre completo de la colección, que incluye el nombre del bucket, está sujeto al límite de longitud del namespace.

Cada documento en la colección chunks [1] representa un fragmento distinto de un archivo tal como se representa en GridFS. Los documentos de esta colección tienen el siguiente formato:

{
"_id" : <ObjectId>,
"files_id" : <ObjectId>,
"n" : <num>,
"data" : <binary>
}

Un documento de la colección chunks contiene los siguientes campos:

chunks._id

El ObjectId único del fragmento.

chunks.files_id

El _id del documento "principal", tal como se especifica en la colección files.

chunks.n

El número de secuencia del fragmento. GridFS numera todos los fragmentos, comenzando con 0.

chunks.data

La carga útil del fragmento como un tipo BSON Binary.

Cada documento en la colección files representa un archivo en GridFS.

{
"_id" : <ObjectId>,
"length" : <num>,
"chunkSize" : <num>,
"uploadDate" : <timestamp>,
"md5" : <hash>,
"filename" : <string>,
"contentType" : <string>,
"aliases" : <string array>,
"metadata" : <any>,
}

Los documentos de la colección files contienen algunos o todos los siguientes campos:

files._id

El identificador único de este documento. El _id es del tipo de datos que se eligió para el documento original. El tipo por defecto para los documentos de MongoDB es BSON ObjectId.

files.length

El tamaño del documento en bytes.

files.chunkSize

El tamaño de cada fragmento en bytes. GridFS divide el documento en fragmentos de tamaño chunkSize, excepto el último, que tiene el tamaño necesario. El tamaño por defecto es 255 kibibytes (KiB).

files.uploadDate

La fecha en que el documento se almacenó por primera vez por GridFS. Este valor tiene el tipo Date.

files.md5

Obsoleto

FIPS 140-2 prohíbe el algoritmo MD5. Los drivers de MongoDB desaprueban el soporte de MD5 y removerán la generación de MD5 en futuras versiones. Las aplicaciones que requieran un resumen de archivo deben implementarlo fuera de GridFS y almacenarlo en files.metadata.

Un hash MD5 del archivo completo devuelto por el comando filemd5. Este valor tiene el tipo String.

files.filename

Opcional. Un nombre legible para el archivo de GridFS.

files.contentType

Obsoleto

Opcional. Un tipo MIME válido para el archivo GridFS. Solo para usar en la aplicación.

Utilice files.metadata para almacenar información relacionada con el tipo MIME del archivo GridFS.

files.aliases

Obsoleto

Opcional. Un arreglo de strings de alias. Solo para usar en la aplicación.

Utilice files.metadata para almacenar información relacionada con el tipo MIME del archivo GridFS.

files.metadata

Opcional. El campo de metadatos puede ser de cualquier tipo de datos y puede contener cualquier información adicional que desees almacenar. Si deseas agregar campos arbitrarios adicionales a documentos de la colección files, agrégalos a un objeto en el campo de metadatos.

GridFS utiliza índices en cada una de las colecciones chunks y files para lograr eficiencia. Los drivers que cumplen con la especificación de GridFS crean automáticamente estos índices para mayor comodidad. También puede crear los índices adicionales que desee para adaptarse a las necesidades de su aplicación.

GridFS utiliza un único, un índice compuesto en la colección chunks que utiliza los campos files_id y n. Esto permite la recuperación eficiente de fragmentos, como se demuestra en el siguiente ejemplo:

db.fs.chunks.find( { files_id: myFileID } ).sort( { n: 1 } )

Los drivers que se ajustan a la especificación de GridFS garantizarán automáticamente que este índice exista antes de las operaciones de lectura y escritura. Consulte la documentación relevante del driver para conocer el comportamiento específico de la aplicación GridFS.

Si este índice no existe, puede emitir la siguiente operación para crearlo con mongosh:

db.fs.chunks.createIndex( { files_id: 1, n: 1 }, { unique: true } );

GridFS utiliza un índice en la colección de files que utilizan los campos filename y uploadDate. Este índice permite la recuperación eficiente de archivos, como se muestra en este ejemplo:

db.fs.files.find( { filename: myFileName } ).sort( { uploadDate: 1 } )

Los drivers que se ajustan a la especificación de GridFS garantizarán automáticamente que este índice exista antes de las operaciones de lectura y escritura. Consulte la documentación relevante del driver para conocer el comportamiento específico de la aplicación GridFS.

Si este índice no existe, puede emitir la siguiente operación para crearlo con mongosh:

db.fs.files.createIndex( { filename: 1, uploadDate: 1 } );
[1](1, 2) El uso del término fragmentos en el contexto de GridFS no está relacionado con el uso del término fragmentos en el contexto de la partición.

Hay dos colecciones que debe considerar con GridFS - files y chunks.

Para fragmentar la colección chunks, utiliza { files_id : 1, n : 1 } o { files_id : 1 } como índice de la clave de partición. files_id es un ObjectId y cambia de forma monótona.

Para los drivers de MongoDB que no ejecutan filemd5 para verificar la carga exitosa, puede usar el particionado encriptado para la colección chunks.

Si el driver de MongoDB ejecuta filemd5, no podrá utilizar particionado encriptado. Para obtener más detalles, consulte SERVIDOR-9888.

La files colección es pequeña y solo contiene metadatos. Ninguna de las claves requeridas para GridFS se presta a una distribución uniforme en un entorno fragmentado. Dejar files sin fragmentar permite que todos los documentos de metadatos de archivo residan en el fragmento principal.

Si debe realizar la partición de la colección files, utilice el campo _id, posiblemente en combinación con un campo de aplicación.

Volver

Google Cloud KMS

En esta página