GridFS fungerer ved at gemme et antal bidder for hver fil. På denne måde kan du levere og gemme meget store filer uden at skulle gemme hele filen i RAM. Dette giver dig også mulighed for at gemme filer, der er større end den maksimale dokumentstørrelse. Den anbefalede chunkstørrelse er 256 kb.
Filmetadatafeltet kan bruges til at gemme yderligere filspecifikke metadata, hvilket kan være mere effektivt end at gemme metadataene i et separat dokument. Dette afhænger i høj grad af dine præcise krav, men metadatafeltet tilbyder generelt meget fleksibilitet. Husk, at nogle af de mere åbenlyse metadata allerede er en del af fs.files
dokument, som standard:
> 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"
}
For rent faktisk at læse filen fra GridFS skal du hente fildokumentet fra fs.files
og bidder fra fs.chunks
. Den mest effektive måde at gøre det på er at streame dette til klienten stykke for stykke, så du ikke behøver at indlæse hele filen i RAM. chunks
samling har følgende 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 */
}
Hvis du vil bruge metadata
felt af fs.files
for dine forespørgsler skal du sørge for at forstå priknotationen, f.eks.
> db.fs.files.find({"metadata.OwnerId": new ObjectId("..."),
"metadata.ImageWidth" : 280});
sørg også for, at dine forespørgsler kan bruge et indeks ved hjælp af explain()
.