Je velmi pravděpodobné, že nemá cenu ukládat data v Mongo pomocí GridFS.
Binární data ve skutečnosti nikdy nepatří do databáze, ale pokud jsou data malá, výhody jejich umístění do databáze (možnost dotazování) převažují nad nevýhodami (zatížení serveru, pomalost).
V tomto případě to vypadá, že byste chtěli uložit data dokumentu (JSON) do GridFS. Můžete to udělat a uložit je tak, jak byste ukládali jakákoli jiná binární data. Data však budou neprůhledná. Nelze dotazovat data JSON uložená v dokumentu GridFS, pouze metadata souboru.
Dotazování na velká data
Jak jste zmínili, že chcete dotazovat data, měli byste zkontrolovat formát dat. Pokud jsou vaše data ve formátu uvedeném v příkladu, zdá se, že není potřeba složitých dotazů, pouze porovnávání řetězců. Existuje tedy několik možností.
Případ 1:Velká data, málo bodů
Pokud nemáte mnoho datových sad (páry field1
a field2
), ale data pro každou z nich jsou velká (field2
obsahuje mnoho bajtů), uložte je jinde a uložte pouze odkaz na to. Jednoduchým řešením by bylo uložit data (dříve field2
) v textovém souboru na Amazon S3 a uložte a poté uložte odkaz. např.
{
field1: “>HWI-ST700660_96:2:1101:1455:2154#[email protected]/1”,
field2link: "https://my-bucket.s3.us-west-2.amazonaws.com/puppy.png"
}
Případ 2:Malá data, mnoho bodů
Pokud je každá vaše datová sada malá (méně než 16 MB), ale existuje mnoho datových sad, uložte svá data do MongoDB (bez GridFS).
Specifika
Ve vašem případě jsou data poměrně velká a jejich ukládání pomocí GridFS se nedoporučuje.
Tato odpověď poskytuje měřítko směrem dolů. Zdá se, že benchmark naznačuje, že doba načítání je víceméně přímo úměrná velikosti souboru. Při stejném nastavení by načtení dokumentu z databáze trvalo 80 sekund.
Možné optimalizace
Výchozí velikost bloku v GridFS je 255 kB. Časy přístupu k velkým souborům můžete zkrátit zvětšením velikosti bloku na maximum (16 MB). Pokud je velikost bloku jediným úzkým hrdlem, pak by použití velikosti bloku 16 MB zkrátilo dobu načítání z 80 sekund na 1,3 sekundy (80 / (16 MB/255 kB) =1,3). Můžete to udělat při inicializaci bucketu GridFS.
new GridFSBucket(db, {chunkSizeBytes: 16000000})
Lepší strategií by bylo uložit jediný název souboru do Mongo a místo toho načíst soubor ze souborového systému.
Další nevýhody
Další možná nevýhoda ukládání binárních dat v Mongu pochází z tento web :"Pokud jsou binární data velká, pak načítání binárních dat do paměti může způsobit, že často používané textové (strukturovaná data) dokumenty budou vytlačeny z paměti, nebo obecněji, pracovní sada se nemusí vejít do paměti RAM. To může mít negativní dopad výkon databáze." [1 ]
Příklad
Uložení souboru v GridFS, upravené z kurzu 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!'))
;
});