80

MongoDB でコレクションを切り捨てるにはどうすればよいですか、またはそのようなことはありますか?

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

4

7 に答える 7

86

コレクションを切り捨ててインデックスを保持するには

 db.<collection>.remove({})
于 2014-04-23T08:12:12.717 に答える
56

を使用すると、コレクションのすべてのデータとインデックスを効率的に削除できます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);
})
于 2013-05-11T07:47:29.607 に答える
19

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

db.collectionname.remove({})
于 2014-07-22T09:12:22.890 に答える
5

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

于 2017-01-12T10:02:11.577 に答える