GridFS funziona memorizzando un numero di blocchi per ogni file. In questo modo, puoi consegnare e archiviare file molto grandi senza dover archiviare l'intero file nella RAM. Inoltre, ciò consente di archiviare file di dimensioni maggiori rispetto alla dimensione massima del documento. La dimensione del blocco consigliata è 256kb.
Il campo dei metadati del file può essere utilizzato per archiviare ulteriori metadati specifici del file, che possono essere più efficienti rispetto alla memorizzazione dei metadati in un documento separato. Ciò dipende molto dai tuoi requisiti esatti, ma il campo dei metadati, in generale, offre molta flessibilità. Tieni presente che alcuni dei metadati più ovvi fanno già parte di fs.files
documento, per impostazione predefinita:
> 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"
}
Per leggere effettivamente il file da GridFS dovrai recuperare il documento del file da fs.files
e i blocchi da fs.chunks
. Il modo più efficiente per farlo è trasmetterlo in streaming al client pezzo per pezzo, quindi non è necessario caricare l'intero file nella RAM. I chunks
raccolta ha la seguente struttura:
> 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 */
}
Se vuoi usare i metadata
campo di fs.files
per le tue domande, assicurati di aver compreso la notazione del punto, ad es.
> db.fs.files.find({"metadata.OwnerId": new ObjectId("..."),
"metadata.ImageWidth" : 280});
assicurati inoltre che le tue query possano utilizzare un indice usando explain()
.