GridFS ist die MongoDB-Spezifikation zum Speichern und Abrufen großer Dateien wie Bilder, Audiodateien, Videodateien usw. Es ist eine Art Dateisystem zum Speichern von Dateien, aber die Daten werden in MongoDB-Sammlungen gespeichert. GridFS ist in der Lage, Dateien zu speichern, die größer sind als die maximale Dokumentengröße von 16 MB.
GridFS unterteilt eine Datei in Chunks und speichert jeden Datenchunk in einem separaten Dokument mit einer maximalen Größe von 255k.
GridFS verwendet standardmäßig zwei Sammlungen fs.files und fs.chunks, um die Metadaten der Datei und die Chunks zu speichern. Jeder Chunk wird durch sein eindeutiges Feld _id ObjectId identifiziert. Die fs.files dient als übergeordnetes Dokument. Das files_id-Feld im fs.chunks-Dokument verknüpft den Chunk mit seinem Parent.
Nachfolgend ein Beispieldokument der fs.files-Sammlung –
{ "filename": "test.txt", "chunkSize": NumberInt(261120), "uploadDate": ISODate("2014-04-13T11:32:33.557Z"), "md5": "7b762939321e146569b07f72c62cca4f", "length": NumberInt(646)}
Das Dokument gibt den Dateinamen, die Chunk-Größe, das Hochladedatum und die Länge an.
Nachfolgend ein Beispieldokument des fs.chunks-Dokuments –
{ "files_id": ObjectId("534a75d19f54bfec8a2fe44b"), "n": NumberInt(0), "data": "Mongo Binary Data"}
Hinzufügen von Dateien zu GridFS
Nun werden wir eine mp3-Datei mit GridFS unter Verwendung des put-Befehls speichern. Dazu verwenden wir das Dienstprogramm mongofiles.exe, das sich im bin-Ordner des MongoDB-Installationsordners befindet.
Öffnen Sie die Eingabeaufforderung, navigieren Sie zu mongofiles.exe im bin-Ordner des MongoDB-Installationsordners und geben Sie den folgenden Code ein –
>mongofiles.exe -d gridfs put song.mp3
Hier ist gridfs der Name der Datenbank, in der die Datei gespeichert werden soll. Wenn die Datenbank nicht vorhanden ist, wird MongoDB automatisch ein neues Dokument erstellen. Song.mp3 ist der Name der hochgeladenen Datei. Um das Dokument der Datei in der Datenbank zu sehen, können Sie die Suchabfrage verwenden –
>db.fs.files.find()
Der obige Befehl gibt das folgende Dokument zurück –
{ _id: ObjectId('534a811bf8b4aa4d33fdf94d'), filename: "song.mp3", chunkSize: 261120, uploadDate: new Date(1397391643474), md5: "e4f53379c909f7bed2e9d631e15c1c41", length: 10401959 }
Wir können auch alle Chunks sehen, die in der fs.chunks collection, die sich auf die gespeicherte Datei beziehen, mit folgendem Code anzeigen lassen, wobei die in der vorherigen Abfrage zurückgegebene Dokument-ID verwendet wird –
>db.fs.chunks.find({files_id:ObjectId('534a811bf8b4aa4d33fdf94d')})
In meinem Fall gab die Abfrage 40 Dokumente zurück, was bedeutet, dass das gesamte mp3-Dokument in 40 Datenbrocken unterteilt wurde.