回答:
mongoシェルで:
use [database];
db.dropDatabase();
そして、ユーザーを削除するには:
db.dropAllUsers();
db.dropAllUsers();
また、コマンドラインから:
mongo DATABASE_NAME --eval "db.dropDatabase();"
すべてのコレクションをリセットする必要があるが、データベースユーザーを失いたくなかったときも、同じ問題が発生しました。データベースのユーザー構成を保存する場合は、次のコード行を使用します。
use <whichever database>
db.getCollectionNames().forEach(function(c) { if (c.indexOf("system.") == -1) db[c].drop(); })
このコードは、1つのデータベースからすべてのコレクション名を調べ、「system。」で始まらないものを削除します。
remove
、の代わりに使用する方が信頼性が高い場合がありますdrop
。このremove
オプションは、クリアするコレクションのフィールドに対する制約を維持するために表示されます。このdrop
方法を採用した場合 unique
、ドロップ後、フィールドの1つに対する制約が守られませんでした。
else
ブランチを(にif (c.indexOf("system.") == -1)
)追加します。そうすれば、使用しなくなっても空のコレクションがなくなるわけではありませんremove
drop
db.getCollectionNames().forEach(function(c) { if (c.indexOf("system.") == -1) db.getCollection(c).drop(); })
私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()});"
db[collection_name].drop()
していて、db.dropDatabase()
メソッドで説明したのと同じ問題を示していました。s/drop/remove/
見事に切り替わりました !
remove()
MongoDB for Windowsではうまく機能しないことがわかりました。代わりにremove({})
、OSXとWindowsの両方で機能するようにする必要がありました。
@Robseと@DanH(kudos!)からの回答をコンパイルすることにより、私を完全に満足させる次の解決策を得ました。
db.getCollectionNames().forEach( function(collection_name) {
if (collection_name.indexOf("system.") == -1)
db[collection_name].drop();
else
db.collection_name.remove({});
});
データベースに接続し、コードを実行します。
ユーザーコレクションを削除し、システムコレクションを空にすることで、データベースをクリーンアップします。
db.getCollectionNames().forEach(c=>db[c].drop())
データベースとそのサブコレクションのみを削除する場合は、次のようにします。
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();
}
}
);
私は好む
db.your_collection.remove({})
以上
db.your_collection.drop()
コレクションが特別なコレクションである場合、つまりキャップされたコレクションまたは1つのフィールドが一意としてマークされているコレクションの場合、ドロップするとコレクション自体が消去され、コレクションが再度作成されると通常のコレクションになります。プロパティを再定義する必要があります。したがってremove()
、コレクションを削除してコレクションの動作に影響を与えずにドキュメントをクリアするために使用します。
drop()
はほぼ瞬時でありremove({})
、dbを数分または数十分の間(コレクションのサイズに応じて)ロックします。
use <dbname>
db.dropAllUsers()
db.dropAllRoles()
db.dropDatabase()
2.6で導入された変更を説明するMongoDB db.dropDatabase()ドキュメント:
バージョン2.6で変更:このコマンドは、現在のデータベースに関連付けられているユーザーを削除しません。
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