sql >> Database teknologi >  >> NoSQL >> MongoDB

Sådan gemmer du en JSON-fil ved hjælp af GridFs

Det er meget sandsynligt ikke værd at gemme dataene i Mongo ved hjælp af GridFS.

Binære data hører aldrig rigtig hjemme i en database, men hvis dataene er små, opvejer fordelene ved at placere dem i databasen (evnen til at forespørge) ulemperne (serverbelastning, langsom).

I dette tilfælde ser det ud til, at du gerne vil gemme dokumentdata (JSON) i GridFS. Du kan gøre dette og gemme det, som du ville gemme andre binære data. Dataene vil dog være uigennemsigtige. Du kan ikke forespørge på JSON-data, der er gemt i et GridFS-dokument, kun filens metadata.

Forespørgsel efter big data

Som du nævnte, at du ønskede at forespørge dataene, bør du kontrollere formatet på dine data. Hvis dine data er i det format, der er angivet i eksemplet, ser det ud til, at der ikke er behov for komplicerede forespørgsler, kun strengmatchning. Så der er flere muligheder.

Case 1:Store data, få punkter

Hvis du ikke har mange datasæt (par af field1 og field2 ), men dataene for hver enkelt er store (field2 indeholder mange bytes), gem disse et andet sted og gem kun en reference til det. En simpel løsning ville være at gemme dataene (tidligere field2 ) i en tekstfil på Amazon S3 og gem derefter linket. f.eks.

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

Case 2:Små data, mange point

Hvis hvert datasæt er lille (mindre end 16 MB), men der er mange datasæt, skal du gemme dine data i MongoDB (uden GridFS).

Specifikationer

I dit tilfælde er dataene ret store, og det er ikke tilrådeligt at gemme dem ved hjælp af GridFS.

Dette svar giver et benchmark mod bunden. Benchmark synes at indikere, at hentetiden er mere eller mindre direkte proportional med filstørrelsen. Med samme opsætning ville det tage 80 sekunder at hente et dokument fra databasen.

Mulige optimeringer

Standard chunk størrelse i GridFS er 255 KiB. Du kan muligvis reducere store filadgangstider ved at øge chunkstørrelsen til det maksimale (16 MB). Hvis chunk-størrelsen er den eneste flaskehals, vil brug af 16 MB chunk-størrelsen reducere hentetiden fra 80 sekunder til 1,3 sekunder (80 / (16 MB/255KiB) =1,3). Du kan gøre dette, når du initialiserer GridFS-bøtten.

new GridFSBucket(db, {chunkSizeBytes: 16000000})

En bedre strategi ville være at gemme det eneste filnavn i Mongo og i stedet hente filen fra filsystemet.

Andre ulemper

En anden mulig ulempe ved at gemme de binære data i Mongo kommer fra dette websted :"Hvis de binære data er store, kan indlæsning af de binære data i hukommelsen medføre, at ofte åbnede tekstdokumenter (strukturerede data) bliver skubbet ud af hukommelsen, eller mere generelt passer arbejdssættet muligvis ikke ind i RAM. Dette kan have en negativ indvirkning på databasens ydeevne." [1 ]

Eksempel

Gemmer en fil i GridFS, tilpasset fra Mongo GridFS tutorial

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!'))
  ;
});


  1. Tilføj en slags rækkenummer til en mongodb samlet kommando / pipeline

  2. Opdatering af et indlejret dokument i MongoDB med officiel C#-driver

  3. Hvordan installeres MongoDb af Meteor?

  4. Spring-data-mongodb opretter forbindelse til flere databaser i én Mongo-instans