En général, si vous n'avez pas besoin de réduire vos fichiers de données, vous ne devriez pas les réduire du tout. En effet, "augmenter" vos fichiers de données sur disque est une opération assez coûteuse et plus MongoDB peut allouer d'espace dans les fichiers de données, moins vous aurez de fragmentation.
Donc, vous devriez essayer de fournir autant d'espace disque que possible pour la base de données.
Cependant si vous devez réduire la base de données, vous devez garder deux choses à l'esprit.
-
MongoDB augmente ses fichiers de données en doublant afin que les fichiers de données puissent atteindre 64 Mo, puis 128 Mo, etc. jusqu'à 2 Go (à ce moment-là, il cesse de doubler pour conserver les fichiers jusqu'à 2 Go.)
-
Comme pour la plupart des bases de données ... des opérations telles que la réduction, vous devrez planifier une tâche distincte pour le faire, il n'y a pas de "réduction automatique" dans MongoDB. En fait, parmi les principales bases de données noSQL (je déteste ce nom), seule Riakwill autoshrink. Vous devrez donc créer une tâche à l'aide du planificateur de votre système d'exploitation pour exécuter une réduction. Vous pouvez utiliser un script bash ou demander à un travail d'exécuter un script php, etc.
Javascript côté serveur
Vous pouvez utiliser Javascript côté serveur pour faire le rétrécissement et exécuter ce JS via le shell de mongo sur une base régulière via un travail (comme cron ou le service de planification Windows) ...
En supposant une collection appelée foo vous enregistreriez le javascript ci-dessous dans un fichier appelé bar.js et lancez ...
$ mongo foo bar.js
Le fichier javascript ressemblerait à quelque chose comme ...
// 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));
Cela s'exécutera et renverra quelque chose comme ...
MongoDB shell version: 1.6.4
connecting to: foo
Storage Size: 51351
TotalSize: 79152
-----------------------
Running db.repairDatabase()
-----------------------
Storage Size: 40960
TotalSize: 65153
Exécutez ceci selon un horaire (hors des heures de pointe) et vous êtes prêt à partir.
Collections plafonnées
Cependant, il existe une autre option, collections plafonnées .
Fondamentalement, vous pouvez limiter la taille (ou le nombre de documents dans) d'une collection à .. 20 Go et une fois cette limite atteinte, MongoDB commencera à supprimer les enregistrements les plus anciens et à les remplacer par les entrées les plus récentes au fur et à mesure de leur arrivée.
C'est un excellent moyen de conserver une grande quantité de données, en supprimant les données les plus anciennes au fil du temps et en conservant la même quantité d'espace disque utilisée.