GridFS jest specyfikacją MongoDB do przechowywania i pobierania dużych plików, takich jak obrazy, pliki audio, pliki wideo itp. Jest to rodzaj systemu plików do przechowywania plików, ale jego dane są przechowywane w kolekcjach MongoDB. GridFS ma możliwość przechowywania plików nawet większych niż jego limit rozmiaru dokumentu 16MB.
GridFS dzieli plik na kawałki i przechowuje każdy kawałek danych w oddzielnym dokumencie, każdy o maksymalnym rozmiarze 255k.
GridFS domyślnie używa dwóch kolekcji fs.files i fs.chunks do przechowywania metadanych pliku i kawałków. Każdy chunk jest identyfikowany przez swoje unikalne pole _id ObjectId. Kolekcja fs.files służy jako dokument nadrzędny. Pole files_id w dokumencie fs.chunks łączy chunk z jego rodzicem.
Poniżej znajduje się przykładowy dokument kolekcji fs.files –
{ "filename": "test.txt", "chunkSize": NumberInt(261120), "uploadDate": ISODate("2014-04-13T11:32:33.557Z"), "md5": "7b762939321e146569b07f72c62cca4f", "length": NumberInt(646)}
Dokument ten określa nazwę pliku, rozmiar chunk, datę wysłania i długość.
Poniżej znajduje się przykładowy dokument kolekcji fs.chunks –
{ "files_id": ObjectId("534a75d19f54bfec8a2fe44b"), "n": NumberInt(0), "data": "Mongo Binary Data"}
Dodawanie plików do GridFS
Teraz zapiszemy plik mp3 używając GridFS za pomocą komendy put. W tym celu użyjemy narzędzia mongofiles.exe obecnego w folderze bin folderu instalacyjnego MongoDB.
Otwórz wiersz poleceń, przejdź do mongofiles.exe w folderze bin folderu instalacyjnego MongoDB i wpisz następujący kod –
>mongofiles.exe -d gridfs put song.mp3
Tutaj, gridfs jest nazwą bazy danych, w której plik będzie przechowywany. Jeśli baza danych nie jest obecna, MongoDB automatycznie utworzy nowy dokument w locie. Song.mp3 to nazwa wgrywanego pliku. Aby zobaczyć dokument pliku w bazie danych, możemy użyć zapytania find –
>db.fs.files.find()
Powyższe polecenie zwróciło następujący dokument –
{ _id: ObjectId('534a811bf8b4aa4d33fdf94d'), filename: "song.mp3", chunkSize: 261120, uploadDate: new Date(1397391643474), md5: "e4f53379c909f7bed2e9d631e15c1c41", length: 10401959 }
Możemy również zobaczyć wszystkie chunki znajdujące się w kolekcji fs.chunks collection związanych z zapisanym plikiem za pomocą następującego kodu, używając id dokumentu zwróconego w poprzednim zapytaniu –
>db.fs.chunks.find({files_id:ObjectId('534a811bf8b4aa4d33fdf94d')})
W moim przypadku zapytanie zwróciło 40 dokumentów, co oznacza, że cały dokument mp3 został podzielony na 40 chunksów danych.
.