GridFS działa, przechowując pewną liczbę porcji dla każdego pliku. W ten sposób możesz dostarczać i przechowywać bardzo duże pliki bez konieczności przechowywania całego pliku w pamięci RAM. Umożliwia to również przechowywanie plików, które są większe niż maksymalny rozmiar dokumentu. Zalecany rozmiar fragmentu to 256kb.
Pole metadanych pliku może służyć do przechowywania dodatkowych metadanych specyficznych dla pliku, co może być bardziej wydajne niż przechowywanie metadanych w osobnym dokumencie. Zależy to w dużej mierze od twoich dokładnych wymagań, ale ogólnie pole metadanych oferuje dużą elastyczność. Pamiętaj, że niektóre z bardziej oczywistych metadanych są już częścią fs.files
dokument, domyślnie:
> db.fs.files.findOne();
{
"_id" : ObjectId("4f9d4172b2ceac15506445e1"),
"filename" : "2e117dc7f5ba434c90be29c767426c29",
"length" : 486912,
"chunkSize" : 262144,
"uploadDate" : ISODate("2011-10-18T09:05:54.851Z"),
"md5" : "4f31970165766913fdece5417f7fa4a8",
"contentType" : "application/pdf"
}
Aby faktycznie odczytać plik z GridFS, musisz pobrać dokument pliku z fs.files
i porcje z fs.chunks
. Najskuteczniejszym sposobem na to jest przesyłanie strumieniowe do klienta kawałek po kawałku, dzięki czemu nie trzeba ładować całego pliku do pamięci RAM. chunks
kolekcja ma następującą strukturę:
> db.fs.chunks.findOne({}, {"data" :0});
{
"_id" : ObjectId("4e9d4172b2ceac15506445e1"),
"files_id" : ObjectId("4f9d4172b2ceac15506445e1"),
"n" : 0, // this is the 0th chunk of the file
"data" : /* loads of data */
}
Jeśli chcesz użyć metadata
pole fs.files
w przypadku zapytań upewnij się, że rozumiesz notację z kropkami, np.
> db.fs.files.find({"metadata.OwnerId": new ObjectId("..."),
"metadata.ImageWidth" : 280});
upewnij się również, że Twoje zapytania mogą używać indeksu za pomocą explain()
.