GridFS är MongoDB:s specifikation för lagring och hämtning av stora filer som bilder, ljudfiler, videofiler osv. Det är ett slags filsystem för att lagra filer, men dess data lagras i MongoDB-samlingar. GridFS har möjlighet att lagra filer som är ännu större än dess gräns för dokumentstorlek på 16 MB.
GridFS delar upp en fil i delar och lagrar varje datamängd i ett separat dokument, var och en med en maximal storlek på 255 k.
GridFS använder som standard två samlingar fs.files och fs.chunks för att lagra filens metadata och delarna. Varje chunk identifieras av det unika fältet _id ObjectId. Fs.files fungerar som ett överordnat dokument. Fältet files_id i dokumentet fs.chunks länkar chunken till dess överordnade dokument.
Nedan följer ett exempel på ett dokument från samlingen fs.files –
{ "filename": "test.txt", "chunkSize": NumberInt(261120), "uploadDate": ISODate("2014-04-13T11:32:33.557Z"), "md5": "7b762939321e146569b07f72c62cca4f", "length": NumberInt(646)}
Dokumentet anger filnamn, chunkstorlek, uppladdningsdatum och längd.
Följande är ett exempel på dokumentet fs.chunks –
{ "files_id": ObjectId("534a75d19f54bfec8a2fe44b"), "n": NumberInt(0), "data": "Mongo Binary Data"}
Läggning av filer till GridFS
Nu ska vi lagra en mp3-fil med hjälp av GridFS med kommandot put. För detta kommer vi att använda verktyget mongofiles.exe som finns i bin-mappen i MongoDB:s installationsmapp.
Öppna kommandotolken, navigera till mongofiles.exe i bin-mappen i MongoDB:s installationsmapp och skriv följande kod –
>mongofiles.exe -d gridfs put song.mp3
Här är gridfs namnet på den databas där filen kommer att lagras. Om databasen inte finns kommer MongoDB automatiskt att skapa ett nytt dokument i farten. Song.mp3 är namnet på den uppladdade filen. För att se filens dokument i databasen kan du använda find query –
>db.fs.files.find()
Ovanstående kommando returnerade följande dokument –
{ _id: ObjectId('534a811bf8b4aa4d33fdf94d'), filename: "song.mp3", chunkSize: 261120, uploadDate: new Date(1397391643474), md5: "e4f53379c909f7bed2e9d631e15c1c41", length: 10401959 }
Vi kan också se alla chunks som finns i fs.chunks collection related to the stored file with the following code, using the document id returned in the previous query –
>db.fs.chunks.find({files_id:ObjectId('534a811bf8b4aa4d33fdf94d')})
I mitt fall returnerade frågan 40 dokument, vilket betyder att hela mp3-dokumentet var uppdelat i 40 chunks of data.