MongoDB elimina todos os bancos de dados

97

Gostaria de saber se existe um comando para eliminar todos os bancos de dados do meu MongoDB?

Eu sei que se eu quiser descartar apenas uma tabela de dados, eu só preciso digitar o nome do banco de dados como o código abaixo, mas não quero ter que especificá-lo.

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

Respostas:

142

você pode criar um loop de javascript que faz o trabalho e, em seguida, executá-lo no mongoconsole.

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

salve-o em dropall.js e execute:

mongo dropall.js
ALoR
fonte
13
var mongo = db.getMongo(); mongo.getDBNames().forEach(function (dbname) { var db = mongo.getDB(dbname); db.dropDatabase(); });
tjmehta
3
Você também pode simplesmente copiar e colar o código acima e digitá-lo no console do mongo.
Vivek Pandey
2
Isso eliminou meus bancos de dados do sistema (Mongo Versão 2.4.3). Tive que reiniciar o processo mongodb para fazê-lo funcionar novamente.
Felix Schmidt,
7
Eu acho que quando alguém quer descartar seus bancos de dados, eles não estão querendo descartar os bancos de dados internos do mongo como admin e local.
carlin.scott
Além disso, o banco de dados de configuração, onde as transações são armazenadas.
Rodrigo Pereira Fraga
103

Tente este comando:

mongo --quiet --eval 'db.getMongo().getDBNames().forEach(function(i){db.getSiblingDB(i).dropDatabase()})'
kev
fonte
1
Funciona muito bem e você não precisa criar um arquivo js para ele. Agradável.
Erik Honn
Qual é o simétrico para carregá-lo?
nha
Um problema com essa abordagem que acabei de descobrir é que o db var persiste durante as sessões do console do mongo, portanto, se alguém estivesse interagindo com um dos bancos de dados, ele seria excluído pela chamada db.getSiblingDB.
carlin.scott de
3
Agradável. Isso é perfeito para Docker: Ddocker exec mongodb sh -c "mongo --quiet --eval 'db.getMongo().getDBNames().forEach(function(i){db.getSiblingDB(i).dropDatabase()})'"
perezmlal
Passei pelo mesmo problema e descobri que essa é a melhor solução para tarefas de automação. Você não está ansioso para gravar novos arquivos e fazer download em um pipeline de CI / CD, então um script de uma linha é muito simples de gerenciar
Carmine Ingaldi
21

Você também pode fazer isso com um simples 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();
 })
Andreas
fonte
Em vez de escrever condição if para cada banco de dados, podemos simplesmente colocar em um array e fazer um indexOf.
Sachin Gupta
5

Adicionando a resposta de @ALoR, por conveniência, você pode colocar o seguinte em ~ / .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();
    }
}

Então, no shell mongo, você pode simplesmente fazer

dropDatabases()

Dos documentos:

O Mongo lerá o arquivo .mongorc.js do diretório inicial do usuário que está chamando o mongo. No arquivo, os usuários podem definir variáveis, personalizar o prompt do shell mongo ou atualizar as informações que gostariam de atualizar toda vez que iniciarem um shell.

btiernay
fonte
Fiz atualizações para corrigir os problemas. Obrigado por participar!
btiernay
5

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

Agora você pode executar:

mongo drop_all_dbs.js

e todos os bancos de dados (exceto para admin e local) serão eliminados.

Esta resposta é uma cópia do ALoR, apenas consertar queda de banco de dados do sistema

Gás
fonte
4

Você pode fazer isso facilmente por meio do driver oficial c #:

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

var names = _mongoServer.GetDatabaseNames();
foreach (var name in names)
{
   _mongoServer.DropDatabase(name);
}
Andrew Orsich
fonte
sim, pode ser uma ideia, mas quero fazer isso sem C #. (Desculpe, usei a tag C # para esta pergunta)
John
você pode criar um loop de javascript que faz o trabalho e, em seguida, executá-lo no mongoconsole.
ALoR de
2
@AndrewOrsich e @JohnSmith eu postei o 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(); });

Este é seguro para copiar e executar no mongoshell. Créditos para todas as respostas acima. Apenas exclua o banco de dados 'config' também.

vu le
fonte
-2

É tão fácil quanto

mongo --eval 'db.dropDatabase()'

Ou você pode iniciar uma sessão mongo em seu terminal e escrever

db.dropDatabase()

Que é exatamente o mesmo.

Praça Pedro José Piquero
fonte
A questão é como descartar todos os bancos de dados, não um individual
Rob H