GridFS fonctionne en stockant un certain nombre de morceaux pour chaque fichier. De cette façon, vous pouvez livrer et stocker des fichiers très volumineux sans avoir à stocker le fichier entier dans la RAM. Cela vous permet également de stocker des fichiers dont la taille dépasse la taille maximale du document. La taille de bloc recommandée est de 256 Ko.
Le champ de métadonnées de fichier peut être utilisé pour stocker des métadonnées supplémentaires spécifiques au fichier, ce qui peut être plus efficace que de stocker les métadonnées dans un document séparé. Cela dépend grandement de vos besoins exacts, mais le champ des métadonnées, en général, offre une grande flexibilité. Gardez à l'esprit que certaines des métadonnées les plus évidentes font déjà partie du fs.files
document, par défaut :
> 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"
}
Pour lire réellement le fichier à partir de GridFS, vous devrez récupérer le document de fichier à partir de fs.files
et les morceaux de fs.chunks
. Le moyen le plus efficace de le faire est de le diffuser au client morceau par morceau, de sorte que vous n'ayez pas à charger le fichier entier dans la RAM. Les chunks
collection a la structure suivante :
> 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 */
}
Si vous souhaitez utiliser les metadata
champ de fs.files
pour vos requêtes, assurez-vous de bien comprendre la notation par points, par exemple
> db.fs.files.find({"metadata.OwnerId": new ObjectId("..."),
"metadata.ImageWidth" : 280});
assurez-vous également que vos requêtes peuvent utiliser un index en utilisant explain()
.