Många applikationer involverar filhantering och har fillagring som en viktig funktion för att förbättra databehandlingen. Fillagring kräver ofta ett CDN från tredje part (Content Delivery Network), såsom Amazon Web Services, men detta gör hanteringsprocessen lite tråkig. Det skulle vara lättare att komma åt alla dina resurser från en enda molnlagring, snarare än flera, eftersom det kan finnas en risk för fel under hämtning.
Att lagra filer direkt i en databas genom ett enda API-anrop har inte varit lätt att göra förrän GridFS introducerades i MongoDB.
Vad är MongoDB GridFS
GridFs är ett abstraktionslager i MongoDB som används vid lagring och återställning av stora filer som videor, ljud och bilder. Det här filsystemet lagrar filer som är ännu mer betydande än 16 MB inom MongoDB-datasamlingar. Filerna lagras genom att först dela upp dem i mindre databitar, där varje bit har en storlek på 255 KB.
GridFS använder två insamlingssystem för att lagra filer:
- Chunk :Det här är samlingen som lagrar dokumentdelarna. Bitarna är begränsade till en storlek på 255KB vardera och när man gör en fråga, sätter GridFS-drivrutinen ihop alla bitarna enligt lagrings unika _id. Till exempel kan du vilja hämta ett segment av en videofil snarare än hela filen, detta är möjligt genom att bara fråga efter det korrekta intervallet du vill ha.
- Fil :Detta lagrar den efterföljande extra metadata för filen.
Samlingarna placeras i en gemensam hink och sedan prefix var och en med hinknamnet som som standard är fs och så har vi:
- fs.chunks
- fs.files
Man kan välja ett annat hinknamn men det fullständiga samlingsnamnet är föremål för:namnutrymmesgräns på 255 byte.
Chunks Collection
Insamlingsdokument för bitar har formen:
{
"_id" : <ObjectId>,
"files_id" : <ObjectId>,
"n" : <num>,
"data" : <binary>
}
Var:
- _id:är den unika identifieraren för biten
- files_id:är _id för det överordnade dokumentet som lagras i filsamlingen
- n:är sekvensnumret för biten som börjar med 0.
- data:är bitens nyttolast som BSON binär typ.
Ett sammansatt index som använder files_id och n-fält används för att möjliggöra effektiv hämtning av bitar, till exempel:
db.fs.chunks.find( { files_id: fileId } ).sort( { n: 1 } )
För att skapa detta index om det inte finns kan du köra följande kommando på ett mongo-skal:
db.fs.chunks.createIndex( { files_id: 1, n: 1 }, { unique: true } );
Filsamling
Dokumenten i den här samlingen har formen
{
"_id" : <ObjectId>,
"length" : <num>,
"chunkSize" : <num>,
"uploadDate" : <timestamp>,
"filename" : <string>,
"metadata" : <any>,
}
Var:
- _id:är den unika identifieraren för dokumentet som är av den datatyp man väljer för originaldokumentet och som standard i MongoDB är BSON ObjectId.
- längd:är storleken på dokumentet i byte
- chunkSize:storleken på varje bit som är begränsad till 255 kilobyte
- uploadDate:fält av typen Datum som lagrar det datum då dokumentet först lagrades.
- filnamn:detta är ett valfritt fält som är en läsbar identifiering för filen.
- metadata:detta är ett valfritt fält som innehåller ytterligare information som man vill lagra.
Ett exempel på en fs-fil visas nedan.
{
"filename": "file.html",
"chunkSize": NumberInt(23980),
"uploadDate": ISODate("2020-08-11T10:02:15.237Z"),
"length": NumberInt(312)
}
Liksom chunks-samlingen används ett sammansatt index med filnamn och uploadDate-fält i filsamlingen för att möjliggöra effektiv hämtning av filer, till exempel:
db.fs.files.find( { filename: fileName } ).sort( { uploadDate: 1 } )
För att skapa detta index om det inte finns kan du köra följande kommando på ett mongo-skal:
db.fs.file.createIndex( { filename: 1, uploadDate: 1 }, { unique: true } );
När man ska använda MongoDB GridFS-lagringssystemet
MongoDB GridFS är inte vanligt förekommande men följande är villkoret som kan kräva användning av detta GridFS-lagringssystem;
- När det aktuella filsystemet har en gräns för antalet filer som kan lagras i en given katalog.
- När man tänker komma åt en del av den lagrade informationen, gör GridFS det möjligt för en att återkalla delar av filen utan att komma åt hela dokumentet.
- När man har för avsikt att distribuera filer och deras metadata genom geografiskt distribuerade replikuppsättningar, låter GridFS metadata synkronisera och distribuera data över flera målsystem automatiskt.
När man inte ska använda MongoDB GridFS-lagringssystemet
GridFS-lagringssystemet är dock inte lämpligt att använda när det kommer att finnas ett behov av att uppdatera innehållet i hela filen som är sparad i GridFS.
Hur man lägger till filer i GridFS
När du lagrar en mp3-fil i MongoDB med GridFs, är rätt procedur att följa detta;
- Öppna terminalen (kommandotolken)
- Navigera till mongofiles.exe (denna finns i bin-mappen)
- Använd kommandot
>mongofiles.exe -d gridfs put song.mp3
Efter kommandot är namnet på databasen som ska användas gridfs, om namnet av en slump saknas skapar MongoDB automatiskt ett dokument som lagrar filen i databasen.
För att se filen som är lagrad i GridFS använd frågekommandot nedan på mongo-skalet;
>db.fs.files.find()
Kommandot returnerar ett dokument med formatet som visas nedan:
{
_id: ObjectId('526a922bf8b4aa4d33fdf84d'),
filename: "song.mp3",
chunkSize: 233390,
uploadDate: new Date(1397391643474), md5: "e4f53379c909f7bed2e9d631e15c1c41",
length: 10302960
}
Filen har följande detaljer, filnamn, längd, uppladdningsdatum, chunk-storlek och object_id. Bitarna i fs.chunks-samlingen kan ses med det id som returneras i den initiala frågan som visas nedan.
>db.fs.chunks.find({files_id:ObjectId('526a922bf8b4aa4d33fdf84d')})
GridFS Sharding
Sharding är också en annan funktion som är användbar med GridFS. För att samla in fragment kan man använda antingen ett sammansatt index av { files_id :1, n :1 } eller { files_id :1 } som shard-nyckel.
Harshed Sharding är endast möjligt om MongoDB-drivrutinerna inte kör filemd5.
Filsamlingar delas ofta inte eftersom de bara innehåller metadata och är väldigt små. De tillgängliga nycklarna ger inte heller en jämn fördelning i ett fragmenterat kluster. Men om man behöver klippa en filsamling kan du använda fältet _id i kombination med vissa applikationsfält.
GridFS-begränsningar
GridFS-filsystemet har följande begränsningar:
- Atomic uppdatering: GridFS har ingen atomuppdatering. Detta gör det enklare att uppdatera manuellt genom att välja önskad version av filer och hålla flera versioner av filer igång
- Prestanda : systemet tenderar att vara långsamt med filsystemet och webbservern.
- Arbetsset: man använder en annan server när man arbetar med en ny arbetsuppsättning. Detta görs för att undvika att störa den pågående arbetsuppsättningen.
Slutsats
GridFS är som en silverkula för utvecklare som tänker lagra stora filer i MongoDB. GridFS lagringssystem ger utvecklare en chans att lagra stora filer och hämta delar av de nödvändiga filerna. GridFS är därför en utmärkt MongoDB-funktion som kan användas med olika applikationer.