MongoDB löscht jede Datenbank

97

Ich möchte wissen, ob es einen Befehl zum Löschen aller Datenbanken aus meiner MongoDB gibt.

Ich weiß, wenn ich nur eine Datentabelle löschen möchte, muss ich nur den Namen der Datenbank wie den folgenden Code eingeben, aber ich möchte ihn nicht angeben müssen.

mongo DB_NAME --eval 'db.dropDatabase();'
John
quelle

Antworten:

142

Sie können eine Javascript-Schleife erstellen, die den Job erledigt, und sie dann in der Mongoconsole ausführen.

var dbs = db.getMongo().getDBNames()
for(var i in dbs){
    db = db.getMongo().getDB( dbs[i] );
    print( "dropping db " + db.getName() );
    db.dropDatabase();
}

Speichern Sie es in dropall.js und führen Sie dann Folgendes aus:

mongo dropall.js
ALoR
quelle
13
var mongo = db.getMongo(); mongo.getDBNames().forEach(function (dbname) { var db = mongo.getDB(dbname); db.dropDatabase(); });
tjmehta
3
Sie können auch einfach den obigen Code kopieren und in die Mongo-Konsole eingeben.
Vivek Pandey
2
Dadurch wurden meine Systemdatenbanken gelöscht (Mongo Version 2.4.3). Ich musste den Mongodb-Prozess neu starten, damit er wieder funktioniert.
Felix Schmidt
7
Ich denke, wenn jemand seine Datenbanken löschen möchte, möchte er nicht die mongo-internen Datenbanken wie admin und local löschen.
carlin.scott
Auch die Konfigurationsdatenbank, in der die Transaktionen gespeichert sind.
Rodrigo Pereira Fraga
103

Versuchen Sie diesen Befehl:

mongo --quiet --eval 'db.getMongo().getDBNames().forEach(function(i){db.getSiblingDB(i).dropDatabase()})'
kev
quelle
1
Funktioniert hervorragend und Sie müssen keine JS-Datei dafür erstellen. Nett.
Erik Honn
Was ist die Symmetrie, um es zu laden?
nha
Ein Problem bei diesem Ansatz, das ich gerade gefunden habe, ist, dass die Datenbankvariable über Mongo-Konsolensitzungen bestehen bleibt. Wenn also jemand mit einer der Datenbanken interagiert, wird dies durch den Aufruf von db.getSiblingDB ausgeschlossen.
carlin.scott
3
Nett. Dies ist perfekt für Docker: Ddocker exec mongodb sh -c "mongo --quiet --eval 'db.getMongo().getDBNames().forEach(function(i){db.getSiblingDB(i).dropDatabase()})'"
perezmlal
Ich habe das gleiche Problem durchlaufen und festgestellt, dass dies die beste Lösung für Automatisierungsaufgaben ist. Sie
möchten
21

Sie können dies auch mit einem einfachen Mongo-Befehl tun:

db.adminCommand("listDatabases").databases.forEach( function (d) {
    if (d.name != "local" && d.name != "admin"  && d.name != "apiomat"  && d.name != "config")
        db.getSiblingDB(d.name).dropDatabase();
 })
Andreas
quelle
Anstatt für jede Datenbank eine if-Bedingung zu schreiben, können wir einfach ein Array einfügen und einen indexOf erstellen.
Sachin Gupta
5

Wenn Sie die Antwort von @ ALoR ergänzen, können Sie der Einfachheit halber Folgendes in ~ / .mongorc.js einfügen

function dropDatabases(){
    var mongo = db.getMongo();

    var dbNames = mongo.getDBNames();
    for (var i = 0; i < dbNames.length; i++) {
        var db = mongo.getDB( dbNames[i] );

        print( "Dropping database " + db.getName() + "..." );
        db.dropDatabase();
    }
}

Dann können Sie an der Mongo-Muschel einfach machen

dropDatabases()

Aus den Dokumenten:

Mongo liest die Datei .mongorc.js aus dem Ausgangsverzeichnis des Benutzers, der mongo aufruft. In der Datei können Benutzer Variablen definieren, die Eingabeaufforderung der Mongo-Shell anpassen oder Informationen aktualisieren, die bei jedem Start einer Shell aktualisiert werden sollen.

Übrigens
quelle
Ich habe Aktualisierungen vorgenommen, um die Probleme zu beheben. Danke, dass du mitgemacht hast!
btiernay
5

Speichern Sie dies in drop_all_dbs.js:

var databases = db.getMongo().getDBNames()
for(var i in databases){
    db = db.getMongo().getDB( databases[i] );
    if(db.getName() == "admin" || db.getName() == "local"){
        print("skipping db " + db.getName())
        continue
    }
    print( "dropping db " + db.getName() );
    db.dropDatabase();
}

Jetzt können Sie ausführen:

mongo drop_all_dbs.js

und alle Datenbanken (außer admin und local) werden gelöscht.

Diese Antwort ist eine Kopie von ALoRs, korrigieren Sie einfach den Tropfen der System-Datenbank

Gas
quelle
4

Sie können es einfach über den offiziellen c # -Treiber tun:

var _mongoServer = MongoServer.Create("mongodb://localhost:27020");

var names = _mongoServer.GetDatabaseNames();
foreach (var name in names)
{
   _mongoServer.DropDatabase(name);
}
Andrew Orsich
quelle
Ja, es könnte eine Idee sein, aber ich möchte es ohne C # tun. (Oh sorry, ich habe Tag C # für diese Frage verwendet)
John
Sie können eine Javascript-Schleife erstellen, die den Job erledigt, und sie dann in der Mongoconsole ausführen.
ALoR
2
@ AndrewOrsich und @ JohnSmith Ich habe das Skript gepostet.
ALoR
1

var mongo = db.getMongo(); mongo.getDBNames().filter(n => n != 'admin' && n != 'local' && n != 'config').forEach(function (dbname) { var db = mongo.getDB(dbname); db.dropDatabase(); });

Dieser ist sicher zu kopieren und auf Mongoshell auszuführen. Credits für alle Antworten oben. Schließen Sie einfach auch die 'config'-Datenbank aus.

vu le
quelle
-2

Es ist so einfach wie

mongo --eval 'db.dropDatabase()'

Oder Sie können eine Mongo-Sitzung auf Ihrem Terminal starten und schreiben

db.dropDatabase()

Welches ist genau das gleiche.

Pedro José Piquero Plaza
quelle
Die Frage ist, wie alle Datenbanken
Rob H