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