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

Ukládání souborů v MongoDB pomocí GridFS

Mnoho aplikací zahrnuje správu souborů a ukládání souborů je důležitou funkcí pro zlepšení zpracování dat. Ukládání souborů často vyžaduje síť CDN (Content Delivery Network) třetí strany, jako jsou webové služby Amazon, ale díky tomu je proces správy trochu únavný. Bylo by snazší přistupovat ke všem zdrojům z jednoho cloudového úložiště, nikoli z více, protože může nastat riziko selhání během načítání.

Ukládání souborů přímo do databáze prostřednictvím jediného volání API nebylo až do zavedení GridFS v MongoDB snadné.

Co je MongoDB GridFS

GridFs je abstraktní vrstva v MongoDB používaná při ukládání a obnově velkých souborů, jako jsou videa, audio a obrázky. Tento souborový systém ukládá soubory, které jsou v rámci datových kolekcí MongoDB ještě významnější než 16 MB. Soubory se ukládají tak, že je nejprve rozdělíte na menší části dat, z nichž každý má velikost 255 kB.

GridFS používá k ukládání souborů dva systémy sběru dat:

  1. Chunk :Toto je kolekce, ve které jsou uloženy části dokumentu. Jednotlivé části jsou omezeny na velikost 255 kB a když jeden provede dotaz, ovladač GridFS znovu sestaví všechny části podle jedinečného _id úložiště. Můžete například chtít načíst část videosouboru spíše než celý soubor, to je možné pouhým dotazem na správný požadovaný rozsah.
  2. Soubor :Toto uloží následná další metadata pro soubor.

Sbírky jsou umístěny ve společném segmentu a před každým je pak uveden název segmentu, který je ve výchozím nastavení fs, takže máme:

  • fs.chunks
  • fs.files

Můžete si vybrat jiný název segmentu, ale celý název kolekce podléhá následujícímu:limitu jmenného prostoru 255 bajtů.

Sbírka kusů

Doklady shromažďování bloků mají tvar: 

{

  "_id" : <ObjectId>,

  "files_id" : <ObjectId>,

  "n" : <num>,

  "data" : <binary>

}

Kde:

  • _id:je jedinečný identifikátor bloku
  • files_id:je _id nadřazeného dokumentu uloženého v kolekci souborů
  • n:je pořadové číslo bloku začínající 0.
  • data:je užitečné zatížení bloku jako binární typ BSON.

Složený index využívající pole files_id a n se používá k umožnění efektivního načítání bloků, například:

db.fs.chunks.find( { files_id: fileId } ).sort( { n: 1 } )

Pro vytvoření tohoto indexu, pokud neexistuje, můžete spustit následující příkaz v mongo shell:

db.fs.chunks.createIndex( { files_id: 1, n: 1 }, { unique: true } );

Sbírka souborů

Dokumenty v této sbírce mají formu

{

  "_id" : <ObjectId>,

  "length" : <num>,

  "chunkSize" : <num>,

  "uploadDate" : <timestamp>,

  "filename" : <string>,

  "metadata" : <any>,

}

Kde:

  •  _id:je jedinečný identifikátor dokumentu, který je datového typu, který zvolíte pro původní dokument, a ve výchozím nastavení v MongoDB je BSON ObjectId.
  • délka:je velikost dokumentu v bajtech
  • chunkSize:velikost každého bloku, která je omezena na 255 kilobajtů
  • uploadDate:pole typu Datum, ve kterém je uloženo datum prvního uložení dokumentu.
  • název souboru:toto je nepovinné pole, které představuje lidsky čitelnou identifikaci souboru.
  • metadata:toto je volitelné pole, které obsahuje další informace, které je třeba uložit.

Příklad souboru fs je uveden níže.

{

   "filename": "file.html",

   "chunkSize": NumberInt(23980),

   "uploadDate": ISODate("2020-08-11T10:02:15.237Z"),

   "length": NumberInt(312)

}

Stejně jako kolekce chunks se v kolekci souborů používá složený index využívající pole název_souboru a uploadDate, aby bylo možné efektivně načítat soubory, například:

db.fs.files.find( { filename: fileName } ).sort( { uploadDate: 1 } )

Pro vytvoření tohoto indexu, pokud neexistuje, můžete spustit následující příkaz v mongo shell:

db.fs.file.createIndex( { filename: 1, uploadDate: 1 }, { unique: true } );

Kdy použít úložný systém MongoDB GridFS

MongoDB GridFS se běžně nepoužívá, ale  níže jsou podmínky, které mohou vyžadovat použití tohoto úložného systému GridFS;

  •  Když má aktuální systém souborů omezený počet souborů, které lze uložit do daného adresáře.
  •  Když má někdo v úmyslu získat přístup k části uložených informací, GridFS umožňuje vyvolat části souboru bez přístupu k celému dokumentu.
  • Když někdo zamýšlí distribuovat soubory a jejich metadata prostřednictvím geograficky distribuovaných sad replik, GridFS umožňuje metadatům automaticky synchronizovat a nasazovat data do více cílových systémů.

Kdy nepoužívat úložný systém MongoDB GridFS

Úložný systém GridFS však není vhodné používat, když bude potřeba aktualizovat obsah celého souboru uloženého v GridFS.

Jak přidat soubory do GridFS

Při ukládání souboru mp3 do MongoDB pomocí GridFs je správný postup následující;

  1. Otevřete terminál (příkazový řádek)
  2. Přejděte na mongofiles.exe (ten se nachází ve složce bin)
  3. Použijte příkaz 
    >mongofiles.exe -d gridfs put song.mp3

Po příkazu je název databáze, která se má použít, gridfs, pokud náhodou název chybí, MongoDB automaticky vytvoří dokument, který uloží soubor do databáze.

Pro zobrazení souboru uloženého v GridFS použijte příkaz query níže v mongo shell;

>db.fs.files.find()

Příkaz vrátí dokument s níže uvedeným formátem:

{

   _id: ObjectId('526a922bf8b4aa4d33fdf84d'),

   filename: "song.mp3",

   chunkSize: 233390,

   uploadDate: new Date(1397391643474), md5: "e4f53379c909f7bed2e9d631e15c1c41",

   length: 10302960

}

Soubor má následující podrobnosti, název souboru,  délku, datum nahrání, velikost bloku a id_objektu. Bloky v kolekci fs.chunks lze zobrazit pomocí id vráceného v úvodním dotazu, jak je uvedeno níže.

>db.fs.chunks.find({files_id:ObjectId('526a922bf8b4aa4d33fdf84d')})

Sdílení GridFS

Sharding je také další funkcí použitelnou s GridFS. Ke shromažďování kousků fragmentů lze jako shard klíč použít buď složený index { files_id :1, n :1 } nebo { files_id :1 }.

Harshed Sharding je možné pouze v případě, že ovladače MongoDB nespouštějí filemd5.

Sbírky souborů často nejsou rozděleny, protože obsahují pouze metadata a jsou velmi malé. Dostupné klíče ani neposkytují rovnoměrnou distribuci ve sdíleném clusteru. Pokud však potřebujete rozdělit kolekci souborů, můžete použít pole _id v kombinaci s některými poli aplikace.

Omezení GridFS

Souborový systém GridFS má následující omezení:

  1. Aktuální aktualizace: GridFS nemá atomickou aktualizaci. To usnadňuje ruční aktualizaci výběrem požadované verze souborů a ponecháním spuštěných více verzí souborů
  2. Výkon :  systém má tendenci být pomalý se systémem souborů a webovým serverem.
  3. Pracovní sada: jeden používá jiný server při práci na nové pracovní sadě. To se provádí tak, aby nedošlo k narušení běžící pracovní sady.

Závěr

GridFS je jako stříbrná kulka pro vývojáře, kteří hodlají ukládat velké soubory do MongoDB. Úložný systém GridFS dává vývojářům možnost ukládat velké soubory a získávat části potřebných souborů. GridFS je tedy vynikající funkce MongoDB, kterou lze použít s různými aplikacemi.


  1. Nebezpečí vytváření indexů na MongoDB

  2. Mohu nastavit globální TTL v redis?

  3. Přístup k proměnné mimo redis pipelining funkce na Laravel

  4. Jak používat Memcached s rámcem Yii2