MongoDBデータベースのすべてを削除する


454

MongoDBで開発を行っています。完全に非悪意の目的で、データベース内のすべてのものを吹き飛ばしたい場合があります。つまり、すべての単一のコレクションと他に存在する可能性のあるすべてのものを削除し、ゼロから始めます。これを可能にする1行のコードはありますか?MongoDBコンソールメソッドとMongoDB Rubyドライバーメソッドの両方を提供することのボーナスポイント。

回答:


588

mongoシェルで:

use [database];
db.dropDatabase();

そして、ユーザーを削除するには:

db.dropAllUsers();

23
@connorbodeありがとうございます。私はそれを読みましたが、「B-But OPはデータベースを削除したくありません!」。非常に誤解を招くコマンド!!
Henrique Miranda

注意して使用してください。wiredTigerを使用するシャード環境でユーザーデータベースがなく、dropDatabaseを呼び出すと、データベースが削除され、新しいレコードが追加されると、別のシャードにプライマリとして再表示される可能性があります。
Jason R. Coombs

2
これにより、関連データベースに接続されているユーザーは削除されません。そのため、手動で削除することができます。db.dropAllUsers();
FıratKÜÇÜK

2
「use dbs」コマンドを使用した後、データベースは表示されないことに注意してください。しかし、それはあります。だから、心配はありません。
wynshaft

@StepanYakovenkoおそらくMongoDBインスタンスで認証する必要があります
Josh K

114

また、コマンドラインから:

mongo DATABASE_NAME --eval "db.dropDatabase();"

5
これが2.4.6で機能するとは思いません。私の記録はまだ残っています。
Brandon Clark

これにより、データベース上のユーザーもリモートになりますか?
Gert van den Berg

67

すべてのコレクションをリセットする必要があるが、データベースユーザーを失いたくなかったときも、同じ問題が発生しました。データベースのユーザー構成を保存する場合は、次のコード行を使用します。

use <whichever database>
db.getCollectionNames().forEach(function(c) { if (c.indexOf("system.") == -1) db[c].drop(); })

このコードは、1つのデータベースからすべてのコレクション名を調べ、「system。」で始まらないものを削除します。


2
@DanHで述べたようにremove、の代わりに使用する方が信頼性が高い場合がありますdrop。このremoveオプションは、クリアするコレクションのフィールドに対する制約を維持するために表示されます。このdrop方法を採用した場合 unique、ドロップ後、フィールドの1つに対する制約が守られませんでした。
Scottymac、2015年

@Scottymac-さらに良いことに、の代わりに行うelseブランチを(にif (c.indexOf("system.") == -1))追加します。そうすれば、使用しなくなっても空のコレクションがなくなるわけではありませんremovedrop
Bogdan D

1
より良い、コレクション名が数字である場合のエラーを回避するdb[c]使用。db.getCollection(c)
Jason R. Coombs

1
docsによると MongoDB 2.6以降、dropDatabaseコマンドはユーザーを削除しないため、承認された回答がおそらく望ましいとされています。
Jason R. Coombs

1
コレクション名が数値である場合、これは代わりに動作するはずです:db.getCollectionNames().forEach(function(c) { if (c.indexOf("system.") == -1) db.getCollection(c).drop(); })
コンスタンティンGalbenu

35

db.dropDatabase()は長い間ルートをたどりましたが、テストケース間でデータベースをワイプするためにこれを使用しようとすると、データベースのドロップ後にインデックス制約が順守されないという問題が最終的に見つかる場合があります。その結果、ensureIndexesをいじる必要があるか、または単純なルートは、dropDatabaseをすべて回避して、次のようなループ内の各コレクションから削除するだけです。

db.getCollectionNames().forEach(
  function(collection_name) {
    db[collection_name].remove()
  }
);

私の場合、私はこれをコマンドラインから実行していた:

mongo [database] --eval "db.getCollectionNames().forEach(function(n){db[n].remove()});"

1
この提案をありがとう、私たちは使用db[collection_name].drop()していて、db.dropDatabase()メソッドで説明したのと同じ問題を示していました。s/drop/remove/見事に切り替わりました !
Scottymac

10
remove()MongoDB for Windowsではうまく機能しないことがわかりました。代わりにremove({})、OSXとWindowsの両方で機能するようにする必要がありました。
DanH '19年

ヒントをありがとう、私たちはLinuxプラットフォームを使用していますが、これはもう少し詳しく検討する価値があります。
スコッティマック2015年

2
削除のエラーに気づきました-db [collection_name] .remove()にはクエリがないためです!したがって、実際には次のようにする必要があります。db[collection_name] .remove({})
JoelParke

16

@Robseと@DanH(kudos!)からの回答をコンパイルすることにより、私を完全に満足させる次の解決策を得ました。

db.getCollectionNames().forEach( function(collection_name) { 
  if (collection_name.indexOf("system.") == -1) 
       db[collection_name].drop();
  else  
       db.collection_name.remove({}); 
});

データベースに接続し、コードを実行します。

ユーザーコレクションを削除し、システムコレクションを空にすることで、データベースをクリーンアップします。


このスクリプトは、1つの特定のMongoデータベース内のすべてをクリーンアップします。このデータベース内のすべてのコレクションを消去します。
staskrak

10

mongoシェルを使用したmongodbの完全削除操作が使用されていると聞きました

コレクション内の特定のドキュメントを削除するには: db.mycollection.remove( {name:"stack"} )

コレクション内のすべてのドキュメントを削除するには: db.mycollection.remove()

コレクションを削除するには: db.mycollection.drop()

データベースを削除するには:最初にuse mydbコマンドでそのデータベースに移動し、次に

db.dropDatabase()


7

すべてを一度に削除する必要がある場合:(すべてのデータベースを一度に削除します)

mongo --quiet --eval 'db.getMongo().getDBNames().forEach(function(i){db.getSiblingDB(i).dropDatabase()})'


5

データベースとそのサブコレクションのみを削除する場合は、次のようにします。

  • use <database name>;
  • db.dropDatabase();

mongo内のすべてのデータベースを削除する場合は、次を使用します。

db.adminCommand("listDatabases").databases.forEach(function(d)
             {
              if(d.name!="admin" && d.name!="local" && d.name!="config")
                {
                 db.getSiblingDB(d.name).dropDatabase();
                }
             }
          );

すばらしい答え...これはおそらくユーザーが得ていたものです
robert

1

データベースを削除する最も簡単な方法はブログを言う:

> use blog
switched to db blog
> db.dropDatabase();
{ "dropped" : "blog", "ok" : 1 }

1

Meteor開発者向け。

  1. でアプリを実行している間に2番目のターミナルウィンドウを開きますlocalhost:3000

  2. プロジェクトのフォルダーで、を実行しますmeteor mongo

    coolName = new Mongo.Collection('yourCollectionName');

  3. 次に、単に入力します db.yourCollectionName.drop();

  4. ローカルサーバーの変更が自動的に表示されます。

他の皆のために。

db.yourCollectionName.drop();


1
  1. 使用可能なすべてのdbを一覧表示するshow dbs
  2. 必要なデータベースの使用を選択してください
  3. データベースを削除しますdb.dropDatabase()//追加のコマンドはほとんどありません
  4. db show collectionsで利用可能なすべてのコレクションを一覧表示します
  5. 仕様コレクションdb.collection.drop()を削除します

それが役に立てば幸い


1

私は好む

db.your_collection.remove({})

以上

db.your_collection.drop()

コレクションが特別なコレクションである場合、つまりキャップされたコレクションまたは1つのフィールドが一意としてマークされているコレクションの場合、ドロップするとコレクション自体が消去され、コレクションが再度作成されると通常のコレクションになります。プロパティを再定義する必要があります。したがってremove()、コレクションを削除してコレクションの動作に影響を与えずにドキュメントをクリアするために使用します。


1
良い点。ただし、言及する価値はありますが、これdrop()はほぼ瞬時でありremove({})、dbを数分または数十分の間(コレクションのサイズに応じて)ロックします。
セルジオトゥレンツェフ2018

0

すべてのDBを削除するには、次を使用します。

for i in $(mongo --quiet --host $HOSTNAME --eval "db.getMongo().getDBNames()" | tr "," " ");

do mongo $i --host $HOSTNAME --eval "db.dropDatabase()";

done 


0

MongoDB 3.2以降でMongo().getDBNames()は、mongoシェルでサーバー内のデータベース名のリストが出力されます。

> Mongo().getDBNames()
[ "local", "test", "test2", "test3" ]

> show dbs
local  0.000GB
test   0.000GB
test2  0.000GB
test3  0.000GB

forEach()次に、配列に対するループが呼び出さdropDatabase()れ、リストされているすべてのデータベースを削除します。オプションで、削除したくない重要なデータベースをスキップすることもできます。例えば:

Mongo().getDBNames().forEach(function(x) {
  // Loop through all database names
  if (['admin', 'config', 'local'].indexOf(x) < 0) {
    // Drop if database is not admin, config, or local
    Mongo().getDB(x).dropDatabase();
  }
})

実行例:

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
test2   0.000GB
test3   0.000GB

> Mongo().getDBNames().forEach(function(x) {
...   if (['admin', 'config', 'local'].indexOf(x) < 0) {
...     Mongo().getDB(x).dropDatabase();
...   }
... })

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.