MongoDB でコレクションを切り捨てるにはどうすればよいですか、またはそのようなことはありますか?
現在、6 つの大きなコレクションを一度に削除する必要があり、サーバーを停止し、データベース ファイルを削除してから、データベースとその中のコレクションを再作成しています。データを削除してコレクションをそのままにしておく方法はありますか? 削除操作には非常に時間がかかります。コレクションには何百万ものエントリがあります。
MongoDB でコレクションを切り捨てるにはどうすればよいですか、またはそのようなことはありますか?
現在、6 つの大きなコレクションを一度に削除する必要があり、サーバーを停止し、データベース ファイルを削除してから、データベースとその中のコレクションを再作成しています。データを削除してコレクションをそのままにしておく方法はありますか? 削除操作には非常に時間がかかります。コレクションには何百万ものエントリがあります。
コレクションを切り捨ててインデックスを保持するには
db.<collection>.remove({})
を使用すると、コレクションのすべてのデータとインデックスを効率的に削除できます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();
}
})
コレクションを削除すると、構成されたストレージ エンジンに応じて、ストレージの使用状況が異なることに注意してください。
代わりにデータベースを削除する場合は、通常、ドキュメントが挿入されるときにコレクションが作成されるため、コレクションを明示的に作成する必要はありません。
ただし、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);
})
以下のクエリは、コレクション内のすべてのレコードを削除し、コレクションをそのまま保持します。
db.collectionname.remove({})
MongoDB の「切り捨て」操作に相当するものはありません。すべてのドキュメントを削除できますが、複雑さは O(n) になります。コレクションを削除すると、複雑さは O(1) になりますが、インデックスが失われます。