GridFS è la specifica di MongoDB per memorizzare e recuperare file di grandi dimensioni come immagini, file audio, file video, ecc. È una specie di file system per memorizzare i file, ma i suoi dati sono memorizzati all’interno di collezioni MongoDB. GridFS ha la capacità di memorizzare file anche più grandi del suo limite di dimensione del documento di 16MB.
GridFS divide un file in chunks e memorizza ogni chunk di dati in un documento separato, ognuno di dimensione massima 255k.
GridFS per impostazione predefinita utilizza due collezioni fs.files e fs.chunks per memorizzare i metadati del file e i chunks. Ogni chunk è identificato dal suo campo unico _id ObjectId. La collezione fs.files serve come documento padre. Il campo files_id nel documento fs.chunks collega il chunk al suo genitore.
Di seguito un documento di esempio della collezione fs.files –
{ "filename": "test.txt", "chunkSize": NumberInt(261120), "uploadDate": ISODate("2014-04-13T11:32:33.557Z"), "md5": "7b762939321e146569b07f72c62cca4f", "length": NumberInt(646)}
Il documento specifica il nome del file, la dimensione del chunk, la data di caricamento e la lunghezza.
Segue un documento di esempio del documento fs.chunks –
{ "files_id": ObjectId("534a75d19f54bfec8a2fe44b"), "n": NumberInt(0), "data": "Mongo Binary Data"}
Aggiungimento di file a GridFS
Ora, memorizzeremo un file mp3 con GridFS usando il comando put. Per questo, useremo l’utility mongofiles.exe presente nella cartella bin della cartella di installazione di MongoDB.
Apri il tuo prompt dei comandi, naviga fino a mongofiles.exe nella cartella bin della cartella di installazione di MongoDB e digita il seguente codice –
>mongofiles.exe -d gridfs put song.mp3
Qui, gridfs è il nome del database in cui verrà memorizzato il file. Se il database non è presente, MongoDB creerà automaticamente un nuovo documento al volo. Song.mp3 è il nome del file caricato. Per vedere il documento del file nel database, è possibile utilizzare la query find –
>db.fs.files.find()
Il comando precedente ha restituito il seguente documento –
{ _id: ObjectId('534a811bf8b4aa4d33fdf94d'), filename: "song.mp3", chunkSize: 261120, uploadDate: new Date(1397391643474), md5: "e4f53379c909f7bed2e9d631e15c1c41", length: 10401959 }
Possiamo anche vedere tutti i chunk presenti in fs.chunks relativi al file memorizzato con il seguente codice, utilizzando l’id del documento restituito nella query precedente –
>db.fs.chunks.find({files_id:ObjectId('534a811bf8b4aa4d33fdf94d')})
Nel mio caso, la query ha restituito 40 documenti, il che significa che l’intero documento mp3 era diviso in 40 chunks di dati.