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();
}
})
コレクションを削除すると、構成されたストレージエンジンに応じて、ストレージの使用に関する結果が異なることに注意してください。
代わりにデータベースを削除する場合、ドキュメントが挿入されるとコレクションが作成されるため、通常コレクションを明示的に作成する必要はありません。
ただし、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.<collection>.remove({})
次のクエリはコレクション内のすべてのレコードを削除し、コレクションをそのまま保持しますが、
db.collectionname.remove({})
MongoDBには「切り捨て」操作に相当するものはありません。すべてのドキュメントを削除できますが、O(n)の複雑さを持つか、コレクションを削除すると、複雑さはO(1)になりますが、インデックスが失われます。
データベースとコレクションを作成し、mongodumpを使用してデータベースをbsonファイルにバックアップします。
mongodump --db database-to-use
次に、データベースを削除して以前の環境を再作成する必要がある場合は、mongorestoreを使用します。
mongorestore --drop
コマンドmongodumpを使用すると、バックアップは、dumpという名前のフォルダー内の現在の作業ディレクトリに保存されます。
db.drop()
メソッドは、影響を受けるデータベースの書き込みロックを取得し、完了するまで他の操作をブロックします。
db.remove({})
メソッドを使用するほうがdb.drop()
よりも優れていると思います。
(情報のみ)
Laravelで行う必要がある場合、これを使用できます
ModelName::truncate();
また、Mongo Compass(mongoのGUI)を使用できます。これらの種類の操作について簡単に理解できる優れたツールです