一般に、データファイルを縮小する必要がない場合は、まったく縮小しないでください。これは、ディスク上でデータファイルを「拡張」することはかなりコストのかかる操作であり、MongoDBがデータファイルに割り当てることができるスペースが多いほど、断片化が少なくなるためです。
したがって、データベースにできるだけ多くのディスク容量を提供するようにしてください。
ただし データベースを縮小する必要がある場合は、2つのことに留意する必要があります。
-
MongoDBは、データファイルを2倍にすることでデータファイルを拡大し、データファイルを64MB、次に128MBなど、最大2GBにします(この時点で、2GBになるまでファイルを2倍にするのをやめます)。
-
ほとんどのデータベースと同様に...縮小などのtodo操作では、別のジョブtodoをスケジュールする必要があります。そのため、MongoDBには「自動縮小」はありません。実際、主要なnoSQLデータベース(その名前は嫌いです)は、Riakwillだけが自動縮小します。したがって、縮小を実行するには、OSのスケジューラを使用してジョブを作成する必要があります。 bashスクリプトを使用することも、ジョブにphpスクリプトを実行させることもできます。
サーバーサイドJavascript
サーバー側のJavascriptを使用して、縮小を実行し、ジョブ(cronやWindowsスケジューリングサービスなど)を介して定期的にmongoのシェルを介してそのJSを実行できます...
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
これをスケジュールに従って実行すると(ピーク時間はありません)、準備は完了です。
上限のあるコレクション
ただし、もう1つのオプション、上限付きコレクション があります。 。
基本的に、コレクションのサイズ(またはドキュメントの数)を.. 20GBに制限できます。その制限に達すると、MongoDBは最も古いレコードを破棄し、新しいエントリに置き換えます。
>これは、大量のデータを保持し、時間の経過とともに古いデータを破棄し、同じ量のディスク領域を使用するための優れた方法です。