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
GridFS no admite transacciones multi-documento.
En lugar de almacenar un archivo en un solo documento, GridFS lo divide 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, divide un archivo en fragmentos de 255 KiB, con la excepción del último fragmento. El último fragmento tiene el tamaño justo. Del mismo modo, los archivos que no superan el tamaño del fragmento solo tienen un fragmento final, que utiliza únicamente el espacio necesario, además de algunos metadatos adicionales.
GridFS utiliza dos colecciones para almacenar archivos. Una colección almacena los fragmentos de archivos y la otra almacena los metadatos de los archivos.
Cuando realices una query a GridFS para obtener un archivo, el driver vuelve a montar los fragmentos según sea necesario. Puedes realizar consultas por 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 se desee acceder sin tener que cargarlo completamente en la memoria. Véase también Cuándo usar GridFS.
Cuándo utilizar GridFS
Usa GridFS para almacenar archivos más grandes que 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.
Si su sistema de archivos limita la cantidad de archivos en un directorio, puede usar GridFS para almacenar tantos archivos como sea necesario.
Cuando desees acceder a porciones de archivos grandes sin cargar todo el archivo en la memoria, utiliza GridFS.
Cuando quieras mantener tus archivos y metadatos sincronizados y implementados en varios sistemas e instalaciones, usa GridFS. Con sets de réplicas distribuidos geográficamente, MongoDB distribuye archivos y sus metadatos a instancias
mongoden múltiples instalaciones.
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.
Si todos sus archivos son más pequeños que el límite de tamaño de documento BSON 16 MiB, considere almacenar cada archivo en un documento individual en lugar de usar GridFS. Utilice el tipo de datos BinData para almacenar los datos binarios. Consulte la documentación de sus controladores para obtener más información sobre el uso de BinData.
Utilice GridFS
Para almacenar y recuperar archivos usando GridFS, utilice cualquiera de los siguientes:
La herramienta de línea de comandos
mongofiles. Consulte la referenciamongofilespara obtener documentación.
Colecciones de GridFS
GridFS almacena archivos en dos colecciones:
chunksAlmacena los fragmentos binarios. Para más detalles, consulte la colecciónchunks.filesAlmacena los metadatos del archivo. Para más detalles, consulte la colecciónfiles.
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.filesfs.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.
La colección chunks
Cada documento de 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._idEl ObjectId único del fragmento.
chunks.dataLa carga útil del fragmento como un tipo BSON
Binary.
La colección files
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._idEl identificador único de este documento. El
_ides del tipo de datos que se eligió para el documento original. El tipo por defecto para los documentos de MongoDB es BSON ObjectId.
files.chunkSizeEl 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.uploadDateLa fecha en que el documento se almacenó por primera vez por GridFS. Este valor tiene el tipo
Date.
files.md5Obsoleto
El algoritmo MD5 está prohibido por FIPS 140-2. Los controladores de MongoDB desaconsejan la compatibilidad con MD5 y eliminará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 tipoString.
files.contentTypeObsoleto
Opcional. Un tipo MIME válido para el archivo GridFS. Solo para usar en la aplicación.
Utilice
files.metadatapara almacenar información relacionada con el tipo MIME del archivo GridFS.
files.aliasesObsoleto
Opcional. Un arreglo de strings de alias. Solo para usar en la aplicación.
Utilice
files.metadatapara almacenar información de alias.
GridFS Indexes
GridFS utiliza índices en las colecciones chunks y files para optimizar el rendimiento. Los controladores que cumplen con la especificación GridFS crean automáticamente estos índices. También puede crear índices adicionales según las necesidades de su aplicación.
El índice chunks
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 controladores que cumplen con la especificación GridFS garantizan automáticamente que este índice exista antes de las operaciones de lectura y escritura. Consulte la documentación del controlador correspondiente para conocer el comportamiento específico de su aplicación GridFS.
Si este índice no existe, puede ejecutar la siguiente operación para crearlo usando mongosh:
db.fs.chunks.createIndex( { files_id: 1, n: 1 }, { unique: true } );
El índice files
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 controladores que cumplen con la especificación GridFS garantizan automáticamente que este índice exista antes de las operaciones de lectura y escritura. Consulte la documentación del controlador correspondiente para conocer el comportamiento específico de su aplicación GridFS.
Si este índice no existe, puede ejecutar la siguiente operación para crearlo usando mongosh:
db.fs.files.createIndex( { filename: 1, uploadDate: 1 } );
| [1] | (1, 2) El uso del término chunks en el contexto de GridFS no está relacionado con el uso del término chunks en el contexto de sharding. |
Particionado de GridFS
GridFS tiene dos colecciones a considerar: files y chunks.
chunks Colección
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 controlador de MongoDB se ejecuta en filemd5, no podrá utilizar el particionamiento hash. Para obtener más información, consulte SERVER-9888.
files Colección
La colección files es pequeña y solo contiene metadatos. Ninguna de las claves necesarias para GridFS se presta a una distribución uniforme en un entorno de clúster particionado. Dejar files sin particionar permite que todos los documentos de metadatos de archivos residan en una sola partición.
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.