sql >> Database teknologi >  >> NoSQL >> MongoDB

Lagring af filer i MongoDB med GridFS

Mange applikationer involverer filhåndtering og har fillagring som en vigtig funktion til at forbedre databehandlingen. Fillagring kræver ofte et tredjeparts CDN (Content Delivery Network), såsom Amazon Web-tjenester, men dette gør administrationsprocessen en smule trættende. Det ville være nemmere at få adgang til alle dine ressourcer fra et enkelt cloudlager i stedet for flere, da der kan være en chance for fejl under hentning.

At gemme filer direkte i en database gennem et enkelt API-kald har ikke været noget nemt før introduktionen af ​​GridFS i MongoDB.

Hvad er MongoDB GridFS

GridFs er et abstraktionslag i MongoDB, der bruges til lagring og gendannelse af store filer som videoer, lydfiler og billeder. Dette filsystem gemmer filer, der er endnu vigtigere end 16 MB i MongoDB-datasamlinger. Filerne gemmes ved først at opdele dem i mindre bidder af data, hvor hvert stykke har en størrelse på 255 KB.

GridFS bruger to indsamlingssystemer til at gemme filer:

  1. Chunk :Dette er den samling, der gemmer dokumentdelene. Chunks er begrænset til en størrelse på 255KB hver, og når man laver en forespørgsel, samler GridFS-driveren alle chunks som pr. storage unikke _id. For eksempel kan du ønske at hente et segment af en videofil i stedet for hele filen, dette er muligt ved blot at forespørge på det korrekte område, du ønsker.
  2. Fil :Dette gemmer de efterfølgende ekstra metadata for filen.

Samlingerne placeres i en fælles bucket og derefter præfikser hver bucket navn, som som standard er fs, og så har vi:

  • fs.chunks
  • fs.files

Man kan vælge et andet bucket-navn, men det fulde samlingsnavn er underlagt:navnepladsgrænse på 255 bytes.

Chunks Collection

Kunksamlingsdokumenter har formen: 

{ "_id" :, "files_id" :, "n" :, "data" :}

Hvor:

  • _id:er den unikke identifikator for klumpen
  • files_id:er _id'et for det overordnede dokument som gemt i filsamlingen
  • n:er sekvensnummeret på klumpen, der starter med 0.
  • data:er chunkens nyttelast som BSON binær type.

Et sammensat indeks, der bruger filer_id og n felter, bruges til at tillade effektiv hentning af bidder, f.eks.:

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

For at oprette dette indeks, hvis det ikke eksisterer, kan du køre følgende kommando på en mongo-skal:

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

Filsamling

Dokumenter i denne samling har formen

{ "_id" :, "length" :, "chunkSize" :, "uploadDate" :
, "filename" :, "metadata" :,} 

Hvor:

  •  _id:er den unikke identifikator for dokumentet, som er af den datatype, man vælger for det originale dokument, og som som standard i MongoDB er BSON ObjectId.
  • længde:er størrelsen på dokumentet i bytes
  • chunkSize:størrelsen af ​​hver chunk, som er begrænset til 255 kilobyte
  • uploadDate:felt af typen Dato, som gemmer den dato, hvor dokumentet først blev gemt.
  • filnavn:dette er et valgfrit felt, der er en menneskelig læsbar identifikation for filen.
  • metadata:dette er et valgfrit felt, der indeholder yderligere oplysninger, som man ønsker at gemme.

Et eksempel på en fs-fil er vist nedenfor.

{ "filename":"file.html", "chunkSize":NumberInt(23980), "uploadDate":ISODate("2020-08-11T10:02:15.237Z"), "length":NumberInt(312)} 

Ligesom chunks-samlingen bruges et sammensat indeks, der bruger filnavn og uploadDate-felter i filsamlingen for at tillade effektiv hentning af filer, for eksempel:

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

For at oprette dette indeks, hvis det ikke eksisterer, kan du køre følgende kommando på en mongo-skal:

db.fs.file.createIndex( { filnavn:1, uploaddato:1 }, { unik:sand } ); 

Hvornår skal man bruge MongoDB GridFS-lagersystemet

MongoDB GridFS er ikke almindeligt brugt, men  følgende er betingelsen, der kan nødvendiggøre brugen af ​​dette GridFS-lagersystem;

  •  Når det aktuelle filsystem har en begrænsning på antallet af filer, der kan gemmes i en given mappe.
  •  Når man har til hensigt at få adgang til en del af de lagrede oplysninger, gør GridFS det muligt for en at genkalde dele af filen uden at få adgang til hele dokumentet.
  • Når man har til hensigt at distribuere filer og deres metadata gennem geografisk distribuerede replikasæt, tillader GridFS metadataene at synkronisere og distribuere data på tværs af flere målrettede systemer automatisk.

Hvornår skal MongoDB GridFS-lagersystemet ikke bruges

GridFS-lagersystemet er dog ikke passende at bruge, når der vil være behov for at opdatere indholdet af hele filen gemt i GridFS.

Sådan tilføjer du filer til GridFS

Når du gemmer en mp3-fil i MongoDB ved hjælp af GridFs,  er den rigtige procedure at følge denne;

  1. Åbn terminalen (kommandoprompten)
  2. Naviger til mongofiles.exe (dette er placeret i bin-mappen)
  3. Brug kommandoen 
    >mongofiles.exe -d gridfs put song.mp3 

Efter kommandoen er navnet på den database, der skal bruges, gridfs, hvis navnet ved et tilfælde mangler, opretter MongoDB automatisk et dokument, der gemmer filen i databasen.

For at se filen gemt i GridFS skal du bruge forespørgselskommandoen nedenfor på mongo-skallen;

>db.fs.files.find() 

Kommandoen returnerer et dokument med formatet vist nedenfor:

{ _id:ObjectId('526a922bf8b4aa4d33fdf84d'), filnavn:"song.mp3", chunkSize:233390, uploadDate:new Date(1397391643474), md5:"e7bed31c490} 

Filen har følgende detaljer, filnavn, længde, uploaddato, chunk-størrelse  og object_id. Chunks i fs.chunks-samlingen kan ses ved hjælp af det id, der blev returneret i den indledende forespørgsel, som vist nedenfor.

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

GridFS Sharding

Sharding er også en anden funktion, der er anvendelig med GridFS. Til indsamling af shard chunks kan man bruge enten et sammensat indeks på { files_id :1, n :1 } eller { files_id :1 } som shard-nøgle.

Harshed Sharding er kun mulig, hvis MongoDB-driverne ikke kører filemd5.

Filsamlinger sønderdeles ofte ikke, fordi de kun indeholder metadata og er meget små. De tilgængelige nøgler giver heller ikke en jævn fordeling i en sønderdelt klynge. Men hvis man har brug for at sønderdele en filsamling, kan du bruge feltet _id i kombination med nogle applikationsfelter.

GridFS-begrænsninger

GridFS-filsystemet har følgende begrænsninger:

  1. Atomic opdatering: GridFS har ikke en atomopdatering. Dette gør det nemmere at opdatere manuelt ved at vælge den nødvendige version af filer og holde flere versioner af filer kørende
  2. Ydeevne :  systemet har en tendens til at være langsomt med filsystemet og webserveren.
  3. Arbejdssæt: man bruger en anden server, når man arbejder på et nyt arbejdssæt. Dette gøres for at undgå at forstyrre det kørende arbejdssæt.

Konklusion

GridFS er som en sølvkugle for udviklere, der har til hensigt at gemme store filer i MongoDB. GridFS-lagringssystem giver udviklere en chance for at gemme store filer og hente dele af de nødvendige filer. GridFS er derfor en fremragende MongoDB-funktion, der kan bruges med forskellige applikationer.


  1. Hvordan øger man ydeevnen af ​​opdateringsoperationen i Mongo?

  2. Hvad gør Redis, når den løber tør for hukommelse?

  3. Forskellen mellem at gemme heltal og strenge i Redis

  4. mongo 3 dubletter på unikt indeks - dropDups