Generelt, hvis du ikke behøver at formindske dine datafiler, bør du slet ikke formindske dem. Dette skyldes, at det er en temmelig dyr operation at "dyrke" dine datafiler på disken, og jo mere plads MongoDB kan allokere i datafiler, jo mindre fragmentering vil du have.
Så du bør prøve at give så meget diskplads som muligt til databasen.
Men hvis du skal formindske databasen, skal du huske på to ting.
-
MongoDB udvider sine datafiler ved at fordoble, så datafilerne kan være 64 MB, derefter 128 MB osv. op til 2 GB (hvorefter stopper den med at fordoble for at beholde filer indtil 2 GB.)
-
Som med de fleste enhver database ... todo-operationer som krympning skal du planlægge et separat job for at gøre det, der er ingen "autoshrink" i MongoDB. Faktisk af de store noSQL-databaser (hader det navn) er det kun Riakwill, der automatisk krymper. Så du bliver nødt til at oprette et job ved hjælp af dit OS's skemalægger for at køre en shrink. Du kan bruge et bash-script eller få et job til at køre et php-script osv.
Serverside Javascript
Du kan bruge Javascript på serversiden til at foretage shrink og køre den JS via mongo's shell på regelmæssig basis via et job (som cron eller Windows-planlægningstjenesten) ...
Forudsat en samling kaldet foo du ville gemme javascriptet nedenfor i en fil kaldet bar.js og kør ...
$ mongo foo bar.js
Javascript-filen ville ligne ...
// Get a the current collection size.
var storage = db.foo.storageSize();
var total = db.foo.totalSize();
print('Storage Size: ' + tojson(storage));
print('TotalSize: ' + tojson(total));
print('-----------------------');
print('Running db.repairDatabase()');
print('-----------------------');
// Run repair
db.repairDatabase()
// Get new collection sizes.
var storage_a = db.foo.storageSize();
var total_a = db.foo.totalSize();
print('Storage Size: ' + tojson(storage_a));
print('TotalSize: ' + tojson(total_a));
Dette vil køre og returnere noget som ...
MongoDB shell version: 1.6.4
connecting to: foo
Storage Size: 51351
TotalSize: 79152
-----------------------
Running db.repairDatabase()
-----------------------
Storage Size: 40960
TotalSize: 65153
Kør dette efter en tidsplan (i ingen spidsbelastningstider), og du er klar til at gå.
Begrænsede samlinger
Der er dog en anden mulighed, afgrænsede samlinger .
Grundlæggende kan du begrænse størrelsen af (eller antallet af dokumenter i) en samling for at sige .. 20 GB, og når den grænse er nået, vil MongoDB begynde at smide de ældste poster ud og erstatte dem med nyere poster, efterhånden som de kommer ind.
Dette er en fantastisk måde at beholde en stor mængde data på, kassere de ældre data, efterhånden som tiden går og beholde den samme mængde diskplads, der bruges.