sql >> Databasteknik >  >> NoSQL >> MongoDB

Automatiskt komprimera det raderade utrymmet i mongodb?

I allmänhet, om du inte behöver krympa dina datafiler, bör du inte krympa dem alls. Detta beror på att "odla" dina datafiler på disk är en ganska dyr operation och ju mer utrymme som MongoDB kan allokera i datafiler desto mindre fragmentering kommer du att ha.

Så du bör försöka tillhandahålla så mycket diskutrymme som möjligt för databasen.

Men om du måste krympa databasen bör du ha två saker i åtanke.

  1. MongoDB utökar sina datafiler genom att fördubblas så att datafilerna kan vara 64 MB, sedan 128 MB, etc upp till 2 GB (då slutar den att fördubbla filerna till 2 GB.)

  2. Som med de flesta databas ... att göra-operationer som att krympa måste du schemalägga ett separat jobb för att göra det, det finns ingen "automatisk krympning" i MongoDB. I själva verket av de stora noSQL-databaserna (hatar det namnet) är det bara Riakwill som automatiskt krymper. Så du måste skapa ett jobb med ditt operativsystems schemaläggare för att köra en shrink. Du kan använda ett bash-skript eller låta ett jobb köra ett php-skript, etc.

Serverside Javascript

Du kan använda Javascript på serversidan för att krympa och köra den JS via mongos skal regelbundet via ett jobb (som cron eller Windows schemaläggningstjänst) ...

Förutsatt en samling som heter foo du skulle spara javascriptet nedan i en fil som heter bar.js och kör ...

$ mongo foo bar.js

Javascript-filen skulle se ut ungefär som ...

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

Detta körs och returnerar något 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 detta enligt ett schema (under inga rusningstider) och du är klar att gå.

Begränsade samlingar

Det finns dock ett annat alternativ, begränsade samlingar .

I grund och botten kan du begränsa storleken på (eller antalet dokument i) en samling för att säga .. 20GB och när den gränsen är nådd kommer MongoDB att börja kasta ut de äldsta posterna och ersätta dem med nyare poster när de kommer in.

Detta är ett utmärkt sätt att behålla en stor mängd data, kassera äldre data allt eftersom och behålla samma mängd diskutrymme som används.



  1. $lookup med mongoose

  2. MongoDB $pull

  3. PyMongo Tutorial:Testa MongoDB-failover i din Python-app

  4. Mongoose hitta alla dokument där array.length är större än 0 och sortera data