sql >> Databáze >  >> NoSQL >> MongoDB

Jak uložit soubor JSON pomocí GridFs

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


  1. Jak mohu pivotovat na MongoDB

  2. Mongodb uloží seznam objektů

  3. Bezpečně vložte nebo aktualizujte vnořený dokument v MongoDB

  4. OpenShift Přístup k modulu Mongodb z jiného modulu