MongoDB supprime chaque base de données

97

J'aimerais savoir s'il existe une commande pour supprimer toutes les bases de données de mon MongoDB?

Je sais que si je ne veux supprimer qu'un seul datatable, j'ai juste besoin de taper le nom de la base de données comme le code ci-dessous mais je ne veux pas avoir à le spécifier.

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

Réponses:

142

vous pouvez créer une boucle javascript qui fait le travail, puis l'exécuter dans la mongoconsole.

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

enregistrez-le dans dropall.js puis exécutez:

mongo dropall.js
ALoR
la source
13
var mongo = db.getMongo(); mongo.getDBNames().forEach(function (dbname) { var db = mongo.getDB(dbname); db.dropDatabase(); });
tjmehta
3
Vous pouvez également simplement copier-coller le code ci-dessus et le saisir sur la console mongo.
Vivek Pandey
2
Cela a supprimé mes bases de données système (Mongo version 2.4.3). J'ai dû redémarrer le processus mongodb pour qu'il fonctionne à nouveau.
Felix Schmidt
7
Je pense que lorsque quelqu'un veut supprimer ses bases de données, il ne souhaite pas supprimer les bases de données internes de mongo comme admin et locales.
carlin.scott
En outre, la base de données de configuration, où les transactions sont stockées.
Rodrigo Pereira Fraga le
103

Essayez cette commande:

mongo --quiet --eval 'db.getMongo().getDBNames().forEach(function(i){db.getSiblingDB(i).dropDatabase()})'
kev
la source
1
Fonctionne très bien et vous n'avez pas besoin de créer un fichier js pour cela. Agréable.
Erik Honn
Quel est le symétrique pour le charger?
nha le
Un problème avec cette approche que je viens de trouver est que le db var persiste pendant les sessions de la console mongo, donc si quelqu'un interagissait avec l'une des bases de données, il serait exclu par l'appel db.getSiblingDB.
carlin.scott
3
Agréable. C'est parfait pour Docker: Ddocker exec mongodb sh -c "mongo --quiet --eval 'db.getMongo().getDBNames().forEach(function(i){db.getSiblingDB(i).dropDatabase()})'"
perezmlal
J'ai rencontré le même problème et j'ai découvert que c'était la meilleure solution pour les tâches d'automatisation. Vous n'êtes pas impatient d'écrire de nouveaux fichiers et de les télécharger dans un pipeline CI / CD, donc un script à une seule ligne est très simple à gérer
Carmine Ingaldi
21

Vous pouvez également le faire avec une simple commande 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();
 })
Andreas
la source
Au lieu d'écrire if condition pour chaque DB, nous pouvons simplement mettre dans un tableau et faire un indexOf.
Sachin Gupta
5

En ajoutant à la réponse de @ ALoR, pour plus de commodité, vous pouvez mettre ce qui suit dans ~ / .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();
    }
}

Ensuite, au mongo shell, vous pouvez simplement faire

dropDatabases()

À partir de la documentation:

Mongo lira le fichier .mongorc.js depuis le répertoire personnel de l'utilisateur invoquant mongo. Dans le fichier, les utilisateurs peuvent définir des variables, personnaliser l'invite du shell mongo ou mettre à jour les informations qu'ils souhaiteraient mettre à jour à chaque fois qu'ils lancent un shell.

Btiernay
la source
J'ai fait des mises à jour pour corriger les problèmes. Merci d'avoir répondu!
btiernay
5

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

Vous pouvez maintenant exécuter:

mongo drop_all_dbs.js

et toutes les bases de données (sauf admin et local) seront supprimées.

Cette réponse est une copie de celle d'ALoR, il suffit de corriger la chute des bases de données système

Gaz
la source
4

Vous pouvez le faire facilement grâce au pilote officiel c #:

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

var names = _mongoServer.GetDatabaseNames();
foreach (var name in names)
{
   _mongoServer.DropDatabase(name);
}
Andrew Orsich
la source
oui ça pourrait être une idée, mais je veux le faire sans C #. (Oh désolé, j'ai utilisé le tag C # pour cette question)
John
vous pouvez créer une boucle javascript qui fait le travail, puis l'exécuter dans la mongoconsole.
ALoR
2
@AndrewOrsich et @JohnSmith j'ai posté le script.
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(); });

Celui-ci peut être copié et exécuté en toute sécurité sur mongoshell. Crédits pour toutes les réponses ci-dessus. Excluez également la base de données 'config'.

vu le
la source
-2

C'est aussi simple que

mongo --eval 'db.dropDatabase()'

Ou, vous pouvez démarrer une session mongo sur votre terminal et écrire

db.dropDatabase()

C'est exactement la même chose.

Place Pedro José Piquero
la source
La question est de savoir comment supprimer toutes les bases de données, pas une seule
Rob H