MongoDB elimina tutti i database


97

Vorrei sapere se esiste un comando per eliminare tutti i database dal mio MongoDB?

So che se voglio eliminare solo un datatable, devo solo digitare il nome del database come il codice qui sotto ma non voglio doverlo specificare.

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

Risposte:


142

puoi creare un ciclo javascript che faccia il lavoro e poi eseguirlo nella mongoconsole.

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

salvalo su dropall.js e quindi esegui:

mongo dropall.js

13
var mongo = db.getMongo(); mongo.getDBNames().forEach(function (dbname) { var db = mongo.getDB(dbname); db.dropDatabase(); });
tjmehta

3
Puoi anche semplicemente copiare incollare il codice sopra e digitarlo sulla console mongo.
Vivek Pandey

2
Questo ha eliminato i miei database di sistema (Mongo versione 2.4.3). Ho dovuto riavviare il processo mongodb per farlo funzionare di nuovo.
Felix Schmidt

7
Penso che quando qualcuno vuole eliminare i propri database, non vuole eliminare i database interni di mongo come admin e local.
carlin.scott

Inoltre, il database di configurazione, in cui vengono archiviate le transazioni.
Rodrigo Pereira Fraga,

103

Prova questo comando:

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

1
Funziona alla grande e non è necessario creare un file js per questo. Bello.
Erik Honn

Qual è il simmetrico per caricarlo?
nha

Un problema con questo approccio che ho appena scoperto è che la db var persiste durante le sessioni della console mongo, quindi se qualcuno stava interagendo con uno dei database, sarebbe escluso dalla chiamata db.getSiblingDB.
carlin.scott

3
Bello. Questo è perfetto per Docker: Ddocker exec mongodb sh -c "mongo --quiet --eval 'db.getMongo().getDBNames().forEach(function(i){db.getSiblingDB(i).dropDatabase()})'"
perezmlal

Ho affrontato lo stesso problema e ho scoperto che questa è la migliore soluzione per le attività di automazione. Non sei ansioso di scrivere nuovi file e scaricarli in una pipeline CI / CD, quindi uno script di una
riga

21

Puoi farlo anche con un semplice comando mongo:

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();
 })

Invece di scrivere if condition per ogni DB, possiamo semplicemente inserire un array e fare un indexOf.
Sachin Gupta

5

Aggiungendo alla risposta di @ ALoR, per comodità puoi inserire quanto segue in ~ / .mongorc.js

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();
    }
}

Quindi al mongo shell puoi semplicemente fare

dropDatabases()

Dai documenti:

Mongo leggerà il file .mongorc.js dalla home directory dell'utente che richiama mongo. Nel file, gli utenti possono definire variabili, personalizzare il prompt della shell di mongo o aggiornare le informazioni che vorrebbero aggiornate ogni volta che lanciano una shell.


Ho apportato aggiornamenti per correggere i problemi. Grazie per essere intervenuto!
btiernay

5

Salvalo 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();
}

Ora puoi eseguire:

mongo drop_all_dbs.js

e tutti i database (ad eccezione di admin e local) verranno eliminati.

Questa risposta è una copia di quella di ALoR, basta correggere la caduta del dbs di sistema


4

Puoi farlo facilmente tramite il driver ufficiale c #:

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

var names = _mongoServer.GetDatabaseNames();
foreach (var name in names)
{
   _mongoServer.DropDatabase(name);
}

sì, potrebbe essere un'idea, ma voglio farlo senza C #. (Oh scusa, ho usato il tag C # per questa domanda)
John

puoi creare un ciclo javascript che faccia il lavoro e poi eseguirlo nella mongoconsole.
ALoR

2
@AndrewOrsich e @JohnSmith ho pubblicato la sceneggiatura.
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(); });

Questo è sicuro da copiare ed eseguire su mongoshell. Crediti a tutte le risposte sopra. Escludi anche il database "config".


-2

È facile quanto

mongo --eval 'db.dropDatabase()'

Oppure puoi avviare una sessione di mongo sul tuo terminale e scrivere

db.dropDatabase()

Che è esattamente lo stesso.


La domanda è come eliminare tutti i database, non uno individuale
Rob H
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.