GridFS es la especificación de MongoDB para almacenar y recuperar archivos grandes como imágenes, archivos de audio, archivos de vídeo, etc. Es una especie de sistema de archivos para almacenar archivos, pero sus datos se almacenan dentro de las colecciones de MongoDB. GridFS tiene la capacidad de almacenar archivos incluso mayores que su límite de tamaño de documento de 16MB.
GridFS divide un archivo en trozos y almacena cada trozo de datos en un documento separado, cada uno de un tamaño máximo de 255k.
GridFS por defecto utiliza dos colecciones fs.files y fs.chunks para almacenar los metadatos del archivo y los trozos. Cada chunk se identifica por su campo único _id ObjectId. La colección fs.files sirve como documento padre. El campo files_id en el documento fs.chunks enlaza el chunk con su padre.
A continuación se muestra un documento de ejemplo de la colección fs.files –
{ "filename": "test.txt", "chunkSize": NumberInt(261120), "uploadDate": ISODate("2014-04-13T11:32:33.557Z"), "md5": "7b762939321e146569b07f72c62cca4f", "length": NumberInt(646)}
El documento especifica el nombre del archivo, el tamaño del chunk, la fecha de subida y la longitud.
El siguiente es un documento de muestra de la colección fs.chunks –
{ "files_id": ObjectId("534a75d19f54bfec8a2fe44b"), "n": NumberInt(0), "data": "Mongo Binary Data"}
Añadir archivos a GridFS
Ahora, almacenaremos un archivo mp3 usando GridFS mediante el comando put. Para ello, utilizaremos la utilidad mongofiles.exe presente en la carpeta bin de la carpeta de instalación de MongoDB.
Abra el símbolo del sistema, navegue hasta mongofiles.exe en la carpeta bin de la carpeta de instalación de MongoDB y escriba el siguiente código –
>mongofiles.exe -d gridfs put song.mp3
Aquí, gridfs es el nombre de la base de datos en la que se almacenará el archivo. Si la base de datos no está presente, MongoDB creará automáticamente un nuevo documento sobre la marcha. Song.mp3 es el nombre del archivo cargado. Para ver el documento del fichero en la base de datos, se puede utilizar la consulta find –
>db.fs.files.find()
El comando anterior devuelve el siguiente documento –
{ _id: ObjectId('534a811bf8b4aa4d33fdf94d'), filename: "song.mp3", chunkSize: 261120, uploadDate: new Date(1397391643474), md5: "e4f53379c909f7bed2e9d631e15c1c41", length: 10401959 }
También podemos ver todos los chunks presentes en la colección fs.chunks collection relacionados con el archivo almacenado con el siguiente código, utilizando el id del documento devuelto en la consulta anterior –
>db.fs.chunks.find({files_id:ObjectId('534a811bf8b4aa4d33fdf94d')})
En mi caso, la consulta devolvió 40 documentos lo que significa que todo el documento mp3 estaba dividido en 40 trozos de datos.