Като цяло, ако не е необходимо да свивате вашите файлове с данни, не трябва да ги свивате изобщо. Това е така, защото „отглеждането“ на вашите файлове с данни на диск е доста скъпа операция и колкото повече място може да отдели MongoDB във файловете с данни, толкова по-малко фрагментация ще имате.
Така че трябва да се опитате да осигурите възможно най-много дисково пространство за базата данни.
Въпреки това ако трябва да свиете базата данни, трябва да имате предвид две неща.
-
MongoDB увеличава своите файлове с данни чрез удвояване, така че файловете с данни може да са 64MB, след това 128MB и т.н. до 2GB (в този момент той спира да удвоява, за да запази файлове до 2GB.)
-
Както при повечето бази данни... операции със задачи, като свиване, ще трябва да планирате отделна задача, така че в MongoDB няма „автоматично свиване“. Всъщност от основните noSQL бази данни (мразя това име) само Riakwill автоматично се свива. Така че ще трябва да създадете задание с помощта на планировчика на вашата операционна система, за да стартирате свиване. Можете да използвате bash скрипт или да накарате задача да изпълнява php скрипт и т.н.
Javascript от страна на сървъра
Можете да използвате Javascript от страна на сървъра, за да направите свиването и да стартирате този JS чрез обвивката на mongo редовно чрез задание (като cron или услугата за планиране на Windows) ...
Да приемем колекция, наречена foo ще запазите javascript по-долу във файл, наречен bar.js и стартирайте ...
$ mongo foo bar.js
Javascript файлът би изглеждал нещо като ...
// 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));
Това ще се изпълни и ще върне нещо като ...
MongoDB shell version: 1.6.4
connecting to: foo
Storage Size: 51351
TotalSize: 79152
-----------------------
Running db.repairDatabase()
-----------------------
Storage Size: 40960
TotalSize: 65153
Пуснете това по график (без пикови часове) и сте готови.
Ограничени колекции
Има обаче една друга опция, ограничени колекции .
По принцип можете да ограничите размера на (или броя на документите в ) колекция, да речем .. 20 GB и след като това ограничение бъде достигнато, MongoDB ще започне да изхвърля най-старите записи и да ги заменя с по-нови записи, когато постъпват.
Това е чудесен начин да запазите голямо количество данни, като с течение на времето изхвърляте по-старите данни и запазвате същото количество използвано дисково пространство.