web-dev-qa-db-ja.com

コレクションを切り捨てる

MongoDBでコレクションを切り捨てるにはどうすればよいですか?

現時点では、6つの大きなコレクションを一度に削除する必要があり、サーバーを停止し、データベースファイルを削除してから、データベースとその中のコレクションを再作成します。データを削除してコレクションをそのままにする方法はありますか?削除操作には非常に長い時間がかかります。コレクションには何百万ものエントリがあります。

51
iefpw

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以前のデフォルトのストレージエンジン)は、not解放します 事前に割り当てられたディスクスペース 。これはユースケースに適している場合があります。新しいデータが挿入されると、空きスペースは再利用できます。

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

ただし、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);
})
38
Stennie

コレクションを切り捨てて、インデックスを使用し続けるには

 db.<collection>.remove({})
59
astroanu

次のクエリはコレクション内のすべてのレコードを削除し、コレクションをそのまま保持しますが、

db.collectionname.remove({})
9
IAmHomes

MongoDBには「切り捨て」操作に相当するものはありません。すべてのドキュメントを削除できますが、O(n)の複雑さを持つか、コレクションを削除すると、複雑さはO(1)になりますが、インデックスが失われます。

3
Alon

データベースとコレクションを作成し、mongodumpを使用してデータベースをbsonファイルにバックアップします。

mongodump --db database-to-use

次に、データベースを削除して以前の環境を再作成する必要がある場合は、mongorestoreを使用します。

mongorestore --drop

コマンドmongodumpを使用すると、バックアップは、dumpという名前のフォルダー内の現在の作業ディレクトリに保存されます。

2
vinipsmaker

db.drop()メソッドは、影響を受けるデータベースの書き込みロックを取得し、完了するまで他の操作をブロックします。

db.remove({})メソッドを使用するほうがdb.drop()よりも優れていると思います。

0
Congwu Zhang

(情報のみ)

Laravelで行う必要がある場合、これを使用できます

ModelName::truncate();

また、Mongo Compass(mongoのGUI)を使用できます。これらの種類の操作について簡単に理解できる優れたツールです

0
anil