1. ホーム
  2. mongodb

[解決済み] コレクションを切り捨てる

2023-07-08 19:30:48

質問

MongoDB でコレクションを切り詰めるにはどうすればいいのでしょうか?

今、私は6つの大きなコレクションを一度に削除しなければならず、サーバーを停止し、データベースファイルを削除し、データベースとその中のコレクションを再作成しているところです。データを削除して、コレクションをそのまま残す方法はありますか? 削除操作には非常に長い時間がかかります。コレクションには何百万もの項目があります。

どのように解決するのですか?

コレクションのすべてのデータとインデックスを効率的に削除するには、次のようにします。 db.collection.drop() . 多数のドキュメントやインデックスを持つコレクションを削除することは、 すべてのドキュメントを削除するよりも db.collection.remove({}) . また remove() メソッドは、ドキュメントが削除されるとインデックスを更新するという余分な管理を行います。レプリカセット環境では、oplog が単一のコレクション削除コマンドではなく、削除された各ドキュメントのエントリを含んでいるので、さらに遅くなります。

を使用した例 mongo シェルを使用した例です。

var dbName = 'nukeme';
db.getSiblingDB(dbName).getCollectionNames().forEach(function(collName) {
    // Drop all collections except system ones (indexes/profile)
    if (!collName.startsWith("system.")) {
        // Safety hat
        print("WARNING: going to drop ["+dbName+"."+collName+"] in 5s .. hit Ctrl-C if you've changed your mind!");
        sleep(5000);
        db[collName].drop();
    }
})

コレクションを削除すると、設定されているストレージエンジンによって、ストレージの使用量に異なる結果が出ることは、注目に値します。

  • WiredTiger (MongoDB 3.2 以降のデフォルトのストレージエンジン) は、削除が完了すると削除したコレクション (と関連するインデックス) が使っていた領域を解放します。
  • MMAPv1 (MongoDB 3.0 以前のデフォルトストレージエンジン) は、ドロップしたコレクションが使っていた領域を解放します。 ではありません。 解放する 割り当て済みのディスク領域 . これは、新しいデータが挿入されたときに空き領域が再利用可能になるため、使用事例としては問題ないかもしれません。

データベースを削除する代わりに、ドキュメントが挿入されたときにコレクションが作成されるため、一般的に明示的に作成する必要はありません。

しかし、ここでは、データベースを削除して、同じコレクション名を持つ mongo というシェルを使用しています。

var dbName = 'nukeme';

// Save the old collection names before dropping the DB
var oldNames = db.getSiblingDB(dbName).getCollectionNames();

// Safety hat
print("WARNING: going to drop ["+dbName+"] in 5s .. hit Ctrl-C if you've changed your mind!")
sleep(5000)

db.getSiblingDB(dbName).dropDatabase();

// Recreate database with the same collection names
oldNames.forEach(function(collName) {
    db.getSiblingDB(dbName).createCollection(collName);
})