GridFS funktioniert, indem es eine Reihe von Chunks für jede Datei speichert. Auf diese Weise können Sie sehr große Dateien ausliefern und speichern, ohne die gesamte Datei im RAM speichern zu müssen. Auf diese Weise können Sie auch Dateien speichern, die größer als die maximale Dokumentgröße sind. Die empfohlene Chunk-Größe beträgt 256 KB.
Das Dateimetadatenfeld kann verwendet werden, um zusätzliche dateispezifische Metadaten zu speichern, was effizienter sein kann, als die Metadaten in einem separaten Dokument zu speichern. Dies hängt stark von Ihren genauen Anforderungen ab, aber das Metadatenfeld bietet im Allgemeinen viel Flexibilität. Denken Sie daran, dass einige der offensichtlicheren Metadaten bereits Teil der fs.files
sind Dokument, standardmäßig:
> 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"
}
Um die Datei tatsächlich von GridFS zu lesen, müssen Sie das Dateidokument aus fs.files
abrufen und die Chunks von fs.chunks
. Der effizienteste Weg, dies zu tun, besteht darin, dies Stück für Stück zum Client zu streamen, sodass Sie nicht die gesamte Datei in den Arbeitsspeicher laden müssen. Die chunks
Sammlung hat die folgende 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 */
}
Wenn Sie die metadata
verwenden möchten Feld von fs.files
Stellen Sie bei Ihren Anfragen sicher, dass Sie die Punktnotation verstehen, z. B.
> db.fs.files.find({"metadata.OwnerId": new ObjectId("..."),
"metadata.ImageWidth" : 280});
Stellen Sie außerdem sicher, dass Ihre Abfragen einen Index verwenden können, indem Sie explain()
verwenden .