sql >> Database >  >> NoSQL >> MongoDB

Bestanden opslaan in MongoDB met GridFS

Veel applicaties hebben betrekking op bestandsbeheer en hebben bestandsopslag als een belangrijke functie voor het verbeteren van de gegevensverwerking. Bestandsopslag vereist vaak een CDN (Content Delivery Network) van een derde partij, zoals Amazon Web Services, maar dit maakt het beheerproces een beetje vervelend. Het zou gemakkelijker zijn om toegang te krijgen tot al uw bronnen vanuit een enkele cloudopslag, in plaats van meerdere, omdat er een kans bestaat op een storing tijdens het ophalen.

Het rechtstreeks opslaan van bestanden in een database via een enkele API-aanroep was niet eenvoudig tot de introductie van GridFS in MongoDB.

Wat is MongoDB GridFS

GridFs is een abstractielaag in MongoDB die wordt gebruikt voor de opslag en het herstel van grote bestanden zoals video's, audio en afbeeldingen. Dit bestandssysteem slaat bestanden op die zelfs belangrijker zijn dan 16 MB in MongoDB-gegevensverzamelingen. De bestanden worden opgeslagen door ze eerst op te splitsen in kleinere stukjes gegevens, elk met een grootte van 255 KB.

GridFS gebruikt twee verzamelsystemen om bestanden op te slaan:

  1. Brokken :Dit is de verzameling waarin de documentonderdelen zijn opgeslagen. De chunks zijn beperkt tot een grootte van elk 255 KB en wanneer men een query maakt, assembleert het GridFS-stuurprogramma alle chunks opnieuw volgens de unieke _id van de opslag. U kunt bijvoorbeeld een segment van een videobestand willen ophalen in plaats van het hele bestand, dit is mogelijk door gewoon het juiste bereik op te vragen dat u wilt.
  2. Bestand :Dit slaat de daaruit voortvloeiende aanvullende metadata voor het bestand op.

De collecties worden in een gemeenschappelijke bucket geplaatst en voorvoegsel elk met de bucketnaam die standaard fs is en dus hebben we:

  • fs.chunks
  • fs.files

Men kan een andere bucketnaam kiezen, maar de volledige collectienaam is onderhevig aan:naamruimtelimiet van 255 bytes.

Brokkenverzameling

Chunk collectiedocumenten hebben de volgende vorm: 

{

  "_id" : <ObjectId>,

  "files_id" : <ObjectId>,

  "n" : <num>,

  "data" : <binary>

}

Waar:

  • _id:is de unieke identificatie voor de chunk
  • files_id:is de _id van het bovenliggende document zoals opgeslagen in de bestandenverzameling
  • n:is het volgnummer van de chunk die begint met 0.
  • data:is de payload van de chunk als BSON binair type.

Een samengestelde index die gebruik maakt van files_id en n velden wordt gebruikt om bijvoorbeeld chunks efficiënt op te halen:

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

Als u deze index wilt maken als deze niet bestaat, kunt u de volgende opdracht uitvoeren op een mongo-shell:

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

Bestandenverzameling

Documenten in deze collectie hebben de vorm

{

  "_id" : <ObjectId>,

  "length" : <num>,

  "chunkSize" : <num>,

  "uploadDate" : <timestamp>,

  "filename" : <string>,

  "metadata" : <any>,

}

Waar:

  •  _id:is de unieke identificatie voor het document van het gegevenstype dat men kiest voor het originele document en is standaard in MongoDB de BSON ObjectId.
  • lengte:is de grootte van het document in bytes
  • chunkSize:grootte van elke chunk die beperkt is tot 255 kilobytes
  • uploadDate:veld van het type Datum waarin de datum wordt opgeslagen waarop het document voor het eerst is opgeslagen.
  • bestandsnaam:dit is een optioneel veld dat een door mensen leesbare identificatie voor het bestand is.
  • metadata:dit is een optioneel veld dat aanvullende informatie bevat die men wil opslaan.

Een voorbeeld van een fs-bestand wordt hieronder getoond.

{

   "filename": "file.html",

   "chunkSize": NumberInt(23980),

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

   "length": NumberInt(312)

}

Net als de chunks-verzameling, wordt een samengestelde index met de velden bestandsnaam en uploadDate gebruikt in de bestandenverzameling om efficiënt ophalen van bestanden mogelijk te maken, bijvoorbeeld:

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

Als u deze index wilt maken als deze niet bestaat, kunt u de volgende opdracht uitvoeren op een mongo-shell:

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

Wanneer het MongoDB GridFS-opslagsysteem gebruiken

MongoDB GridFS wordt niet vaak gebruikt, maar de volgende voorwaarden kunnen het gebruik van dit GridFS-opslagsysteem noodzakelijk maken;

  •  Als het huidige bestandssysteem een ​​limiet heeft voor het aantal bestanden dat in een bepaalde map kan worden opgeslagen.
  •  Als men van plan is toegang te krijgen tot een deel van de opgeslagen informatie, stelt GridFS iemand in staat delen van het bestand terug te halen zonder het hele document te openen.
  • Als men van plan is bestanden en hun metadata te distribueren via geografisch gedistribueerde replicasets, laat GridFS de metadata toe om de data automatisch te synchroniseren en te implementeren over meerdere gerichte systemen.

Wanneer mag u het MongoDB GridFS-opslagsysteem niet gebruiken

Het GridFS-opslagsysteem is echter niet geschikt om te gebruiken wanneer de inhoud van het hele bestand dat in GridFS is opgeslagen, moet worden bijgewerkt.

Bestanden toevoegen aan GridFS

Bij het opslaan van een mp3-bestand in MongoDB met behulp van GridFs, is de juiste procedure deze te volgen;

  1. Open de terminal (de opdrachtprompt)
  2. Navigeer naar mongofiles.exe (deze bevindt zich in de bin-map)
  3. Gebruik het commando 
    >mongofiles.exe -d gridfs put song.mp3

Na het commando is de naam van de database die moet worden gebruikt de gridfs, als de naam toevallig ontbreekt, maakt MongoDB automatisch een document dat het bestand in de database opslaat.

Om het bestand dat is opgeslagen in GridFS te bekijken, gebruikt u het onderstaande query-commando op de mongo-shell;

>db.fs.files.find()

De opdracht retourneert een document met de onderstaande indeling:

{

   _id: ObjectId('526a922bf8b4aa4d33fdf84d'),

   filename: "song.mp3",

   chunkSize: 233390,

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

   length: 10302960

}

Het bestand heeft de volgende details, bestandsnaam, lengte, uploaddatum, chunkgrootte en object_id. De chunks in de fs.chunks-collectie kunnen worden bekeken met behulp van de id die is geretourneerd in de eerste zoekopdracht, zoals hieronder wordt weergegeven.

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

GridFS-sharding

Sharding is ook een andere functie die van toepassing is op GridFS. Voor het verzamelen van chunks kan men ofwel een samengestelde index van { files_id :1, n :1 } of { files_id :1 } als de shardsleutel gebruiken.

Harshed Sharding is alleen mogelijk als de MongoDB-stuurprogramma's filemd5 niet uitvoeren.

Bestandsverzamelingen worden vaak niet geshard omdat ze alleen metadata bevatten en erg klein zijn. De beschikbare sleutels bieden ook geen gelijkmatige verdeling in een Shard-cluster. Als u echter een bestandenverzameling moet sharden, kunt u het veld _id gebruiken in combinatie met sommige toepassingsvelden.

GridFS-beperkingen

GridFS-bestandssysteem heeft de volgende beperkingen:

  1. Atoomupdate: GridFS heeft geen atomaire update. Dit maakt het gemakkelijker om handmatig bij te werken door de vereiste versie van bestanden te kiezen en meerdere versies van bestanden actief te houden
  2. Prestaties :  het systeem is meestal traag met het bestandssysteem en de webserver.
  3. Werkset: men gebruikt een andere server bij het werken aan een nieuwe werkset. Dit wordt gedaan om de lopende werkset niet te storen.

Conclusie

GridFS is als een wondermiddel voor ontwikkelaars die grote bestanden in MongoDB willen opslaan. Het GridFS-opslagsysteem geeft ontwikkelaars de kans om grote bestanden op te slaan en delen van de benodigde bestanden op te halen. GridFS is daarom een ​​uitstekende MongoDB-functie die met verschillende applicaties kan worden gebruikt.


  1. Meerdere schemaverwijzingen in een enkele schemaarray - mangoest

  2. Mongoose - met behulp van Populate op een array van ObjectId

  3. Maak opnieuw verbinding met ECONNREFUSED in NodeJS in Kubernetes-cluster

  4. Opvallende kenmerken van MapReduce - Belang van MapReduce