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

Compatta automaticamente lo spazio eliminato in mongodb?

In generale, se non hai bisogno di ridurre i tuoi file di dati, non dovresti ridurli affatto. Questo perché "crescere" i tuoi file di dati su disco è un'operazione abbastanza costosa e più spazio che MongoDB può allocare nei file di dati, minore sarà la frammentazione che avrai.

Quindi, dovresti provare a fornire quanto più spazio possibile su disco per il database.

Comunque se devi ridurre il database dovresti tenere a mente due cose.

  1. MongoDB fa crescere i suoi file di dati raddoppiando in modo che i file di dati possano essere 64 MB, quindi 128 MB, ecc. fino a 2 GB (a quel punto smette di raddoppiare i file tokeep fino a 2 GB.)

  2. Come con la maggior parte di qualsiasi database ... per eseguire operazioni come la riduzione, dovrai pianificare un lavoro separato per farlo, non c'è "riduzione automatica" in MongoDB. In effetti, dei principali database noSQL (odiano quel nome) solo Riak si restringe automaticamente. Quindi, dovrai creare un lavoro utilizzando il programma di pianificazione del tuo sistema operativo per eseguire una riduzione. Potresti usare uno script bash, o fare in modo che un lavoro esegua uno script php, ecc.

Javascript lato server

Puoi utilizzare Javascript lato server per eseguire il restringimento ed eseguire JS tramite la shell di mongo su basi regolari tramite un lavoro (come cron o il servizio di pianificazione di Windows) ...

Supponendo una raccolta chiamata foo dovresti salvare il javascript di seguito in un file chiamato bar.js ed esegui...

$ mongo foo bar.js

Il file javascript sarebbe simile a ...

// 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));

Verrà eseguito e restituito qualcosa come ...

MongoDB shell version: 1.6.4
connecting to: foo
Storage Size: 51351
TotalSize: 79152
-----------------------
Running db.repairDatabase()
-----------------------
Storage Size: 40960
TotalSize: 65153

Eseguilo in base a un programma (in nessuna ora di punta) e sei a posto.

Raccolte limitate

Tuttavia esiste un'altra opzione, raccolte limitate .

Fondamentalmente puoi limitare la dimensione di (o il numero di documenti in ) una raccolta per dire .. 20 GB e una volta raggiunto tale limite MongoDB inizierà a eliminare i record più vecchi e sostituirli con voci più recenti non appena entrano.

Questo è un ottimo modo per conservare una grande quantità di dati, scartando i dati più vecchi col passare del tempo e mantenendo la stessa quantità di spazio su disco utilizzato.