GridFS is de MongoDB-specificatie voor het opslaan en ophalen van grote bestanden zoals afbeeldingen, audiobestanden, videobestanden, enz. Het is een soort van bestandssysteem om bestanden op te slaan, maar de gegevens worden opgeslagen binnen MongoDB collecties. GridFS heeft de mogelijkheid om bestanden op te slaan die zelfs groter zijn dan de document grootte limiet van 16MB.
GridFS verdeelt een bestand in chunks en slaat elke chunk van gegevens in een apart document, elk met een maximale grootte van 255k.
GridFS gebruikt standaard twee collecties fs.files en fs.chunks om de metadata van het bestand en de chunks op te slaan. Elke chunk wordt geïdentificeerd door zijn unieke _id ObjectId veld. De fs.files dient als een bovenliggend document. Het files_id veld in het fs.chunks document linkt de chunk aan zijn parent.
Het volgende is een voorbeeld document van fs.files collectie –
{ "filename": "test.txt", "chunkSize": NumberInt(261120), "uploadDate": ISODate("2014-04-13T11:32:33.557Z"), "md5": "7b762939321e146569b07f72c62cca4f", "length": NumberInt(646)}
Het document specificeert de bestandsnaam, chunk grootte, geuploade datum, en lengte.
Het volgende is een voorbeelddocument van fs.chunks document –
{ "files_id": ObjectId("534a75d19f54bfec8a2fe44b"), "n": NumberInt(0), "data": "Mongo Binary Data"}
Bestanden toevoegen aan GridFS
Nu zullen we een mp3-bestand opslaan met GridFS met behulp van het put-commando. Hiervoor zullen we gebruik maken van de mongofiles.exe utility aanwezig in de bin map van de MongoDB installatie map.
Open uw opdrachtprompt, navigeer naar de mongofiles.exe in de bin map van MongoDB installatie map en typ de volgende code –
>mongofiles.exe -d gridfs put song.mp3
Hier, gridfs is de naam van de database waarin het bestand zal worden opgeslagen. Als de database niet aanwezig is, zal MongoDB automatisch een nieuw document on the fly. Song.mp3 is de naam van het bestand geüpload. Om het bestand document in de database te zien, kunt u gebruik maken van find query –
>db.fs.files.find()
Het bovenstaande commando geretourneerd het volgende document –
{ _id: ObjectId('534a811bf8b4aa4d33fdf94d'), filename: "song.mp3", chunkSize: 261120, uploadDate: new Date(1397391643474), md5: "e4f53379c909f7bed2e9d631e15c1c41", length: 10401959 }
We kunnen ook zien alle chunks aanwezig in fs.chunks collectie met betrekking tot het opgeslagen bestand met de volgende code, met behulp van het document-id geretourneerd in de vorige query –
>db.fs.chunks.find({files_id:ObjectId('534a811bf8b4aa4d33fdf94d')})
In mijn geval retourneerde de query 40 documenten, wat betekent dat het hele mp3-document was verdeeld in 40 chunks van gegevens.