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

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

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

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

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.


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


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

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.


-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.


A questão é como descartar todos os bancos de dados, não um individual
Rob H
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.