sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur man sparar en JSON-fil med GridFs

Det är mycket troligt inte värt att lagra data i Mongo med GridFS.

Binära data hör aldrig riktigt hemma i en databas, men om data är små uppväger fördelarna med att lägga den i databasen (förmågan att fråga) nackdelarna (serverbelastning, långsam).

I det här fallet ser det ut som att du vill lagra dokumentdata (JSON) i GridFS. Du kan göra detta och lagra det som du skulle lagra andra binära data. Uppgifterna kommer dock att vara ogenomskinliga. Du kan inte fråga JSON-data som lagras i ett GridFS-dokument, bara filens metadata.

Söka efter big data

Som du nämnde att du ville fråga efter data, bör du kontrollera formatet på dina data. Om din data är i formatet som anges i exemplet, verkar det som att det inte finns något behov av komplicerade frågor, bara strängmatchning. Så det finns flera alternativ.

Fall 1:Stora data, få poäng

Om du inte har många datamängder (par av field1 och field2 ) men data för var och en är stor (field2 innehåller många byte), lagra dessa någon annanstans och lagra endast en referens till det. En enkel lösning skulle vara att lagra data (tidigare field2 ) i en textfil på Amazon S3 och lagra sedan länken. t.ex.

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

Fall 2:Små data, många poäng

Om varje datauppsättning är liten (mindre än 16 MB) men det finns många datauppsättningar, lagra dina data i MongoDB (utan GridFS).

Specifikationer

I ditt fall är informationen ganska stor och att lagra den med GridFS är inte tillrådligt.

Detta svar ger ett riktmärke mot botten. Riktmärket verkar indikera att hämtningstiden är mer eller mindre direkt proportionell mot filstorleken. Med samma inställning skulle det ta 80 sekunder att hämta ett dokument från databasen.

Möjliga optimeringar

Standardbitstorleken i GridFS är 255 KiB. Du kanske kan minska stora filåtkomsttider genom att öka chunkstorleken till det maximala (16 MB). Om chunkstorleken är den enda flaskhalsen, skulle användningen av 16 MB chunkstorleken minska hämtningstiden från 80 sekunder till 1,3 sekunder (80 / (16MB/255KiB) =1,3). Du kan göra detta när du initierar GridFS-hinken.

new GridFSBucket(db, {chunkSizeBytes: 16000000})

En bättre strategi skulle vara att lagra det enda filnamnet i Mongo och istället hämta filen från filsystemet.

Andra nackdelar

En annan möjlig nackdel med att lagra binära data i Mongo kommer från denna webbplats :"Om den binära datan är stor kan inläsning av binära data i minnet leda till att ofta åtkomliga textdokument (strukturerade data) skjuts ut ur minnet, eller mer generellt kanske arbetsuppsättningen inte passar in i RAM-minnet. Detta kan påverka negativt databasens prestanda." [1 ]

Exempel

Spara en fil i GridFS, anpassad från Mongo GridFS handledning

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. StackExchange TimeoutException när du försöker infoga 750 objekt i 2 uppsättningar i redis

  2. Skanna strängar med nodejs i redis

  3. Hur man bygger en rekursiv struktur med MongoDB

  4. hantera namnutrymmesändringar under deserialisering av JSON String