MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment enregistrer un fichier JSON à l'aide de GridFs

Cela ne vaut très probablement pas la peine de stocker les données dans Mongo en utilisant GridFS.

Les données binaires n'ont jamais vraiment leur place dans une base de données, mais si les données sont petites, les avantages de les mettre dans la base de données (possibilité d'interroger) l'emportent sur les inconvénients (charge du serveur, lenteur).

Dans ce cas, il semble que vous souhaitiez stocker des données de document (JSON) dans GridFS. Vous pouvez le faire et le stocker comme vous le feriez pour n'importe quelle autre donnée binaire. Les données, cependant, seront opaques. Vous ne pouvez pas interroger les données JSON stockées dans un document GridFS, uniquement les métadonnées du fichier.

Interroger le Big Data

Comme vous avez mentionné que vous vouliez interroger les données, vous devez vérifier le format de vos données. Si vos données sont au format indiqué dans l'exemple, il semble qu'il n'y ait pas besoin de requêtes compliquées, seulement de correspondance de chaîne. Il y a donc plusieurs options.

Cas 1 :données volumineuses, peu de points

Si vous n'avez pas beaucoup d'ensembles de données (paires de field1 et field2 ) mais les données pour chacun sont volumineuses (field2 contient de nombreux octets), stockez-les ailleurs et ne stockez qu'une référence à celui-ci. Une solution simple serait de stocker les données (anciennement field2 ) dans un fichier texte sur Amazon S3 et stocker puis stocker le lien. ex.

{
  field1: “>HWI-ST700660_96:2:1101:1455:2154#[email protected]/1”,
  field2link: "https://my-bucket.s3.us-west-2.amazonaws.com/puppy.png"
}

Cas 2 :petites données, nombreux points

Si votre ensemble de données est petit (moins de 16 Mo) mais qu'il existe de nombreux ensembles de données, stockez vos données dans MongoDB (sans GridFS).

Spécificités

Dans votre cas, les données sont assez volumineuses et il est déconseillé de les stocker à l'aide de GridFS.

Cette réponse fournit une référence vers le bas. Le benchmark semble indiquer que le temps de récupération est plus ou moins directement proportionnel à la taille du fichier. Avec la même configuration, il faudrait 80 secondes pour récupérer un document de la base de données.

Optimisations possibles

La taille de bloc par défaut dans GridFS est de 255 Kio. Vous pourrez peut-être réduire les temps d'accès aux fichiers volumineux en augmentant la taille des blocs au maximum (16 Mo). Si la taille de bloc est le seul goulot d'étranglement, l'utilisation de la taille de bloc de 16 Mo réduirait le temps de récupération de 80 secondes à 1,3 seconde (80 / (16 Mo/255 Ko) =1,3). Vous pouvez le faire lors de l'initialisation du bucket GridFS.

new GridFSBucket(db, {chunkSizeBytes: 16000000})

Une meilleure stratégie serait de stocker le seul nom de fichier dans Mongo et de récupérer le fichier à partir du système de fichiers à la place.

Autres inconvénients

Un autre inconvénient possible du stockage des données binaires dans Mongo provient de ce site :"Si les données binaires sont volumineuses, le chargement des données binaires dans la mémoire peut entraîner le dépassement de la mémoire des documents texte (données structurées) fréquemment consultés, ou plus généralement, l'ensemble de travail peut ne pas tenir dans la RAM. Cela peut avoir un impact négatif les performances de la base de données." [1 ]

Exemple

Enregistrement d'un fichier dans GridFS, adapté du tutoriel Mongo GridFS

const uri = 'mongodb://localhost:27017/test';

mongodb.MongoClient.connect(uri, (error, db) => {
  const bucket = new mongodb.GridFSBucket(db);

  fs.createReadStream('./fasta-data.json')
    .pipe(bucket.openUploadStream('fasta-data.json'))
    .on('finish', () => console.log('done!'))
  ;
});