MongoDB usuwa każdą bazę danych


97

Chciałbym wiedzieć, czy istnieje polecenie usunięcia wszystkich baz danych z mojej bazy danych MongoDB?

Wiem, że jeśli chcę porzucić tylko jeden datatable, wystarczy wpisać nazwę bazy danych, jak w poniższym kodzie, ale nie chcę jej określać.

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

Odpowiedzi:


144

możesz utworzyć pętlę javascript, która wykona zadanie, a następnie uruchomisz ją w mongoconsole.

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

zapisz go w dropall.js, a następnie wykonaj:

mongo dropall.js

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

3
Możesz też po prostu skopiować wklej powyższy kod i wpisać go na konsoli mongo.
Vivek Pandey

2
To spowodowało usunięcie moich systemowych baz danych (Mongo wersja 2.4.3). Musiałem ponownie uruchomić proces mongodb, aby znów działał.
Felix Schmidt

7
Myślę, że kiedy ktoś chce porzucić swoje bazy danych, nie chce porzucić wewnętrznych baz danych mongo, takich jak admin i local.
carlin.scott

Ponadto baza danych konfiguracji, w której przechowywane są transakcje.
Rodrigo Pereira Fraga

106

Wypróbuj to polecenie:

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

1
Działa świetnie i nie musisz tworzyć dla niego pliku js. Ładny.
Erik Honn,

Jaka jest symetria, aby go załadować?
nha

Jednym z problemów z tym podejściem, który właśnie odkryłem, jest to, że db var utrzymuje się przez sesje konsoli mongo, więc jeśli ktoś wchodził w interakcję z jedną z baz danych, zostanie to wykluczone przez wywołanie db.getSiblingDB.
carlin.scott

3
Ładny. Jest to idealne rozwiązanie dla Docker: Ddocker exec mongodb sh -c "mongo --quiet --eval 'db.getMongo().getDBNames().forEach(function(i){db.getSiblingDB(i).dropDatabase()})'"
perezmlal

Przeszedłem przez ten sam problem i stwierdziłem, że jest to najlepsze rozwiązanie do zadań automatyzacji. Nie jesteś chętny do pisania nowych plików i pobierania w potoku CI / CD, więc
jednoliniowy

22

Możesz to również zrobić za pomocą prostego polecenia 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();
 })

Zamiast pisać warunek if dla każdej bazy danych, możemy po prostu wstawić tablicę i wykonać indexOf.
Sachin Gupta

7

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

Teraz możesz wykonać:

mongo drop_all_dbs.js

a wszystkie bazy danych (z wyjątkiem admin i lokalne) zostaną usunięte.

Ta odpowiedź jest kopią odpowiedzi ALoR, wystarczy naprawić spadek systemowych dbs


6

Dodając do odpowiedzi @ ALoR, dla wygody możesz umieścić następujący tekst w ~ / .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();
    }
}

Następnie na muszli mongo możesz po prostu zrobić

dropDatabases()

Z dokumentów:

Mongo odczyta plik .mongorc.js z katalogu domowego użytkownika wywołującego mongo. W pliku użytkownicy mogą definiować zmienne, dostosowywać monit powłoki mongo lub aktualizować informacje, które chcieliby aktualizować za każdym razem, gdy uruchamiają powłokę.


Dokonałem aktualizacji, aby rozwiązać problemy. Dzięki za bicie!
btiernay

4

Możesz to łatwo zrobić za pomocą oficjalnego sterownika C #:

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

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

tak, to mógłby być pomysł, ale chcę to zrobić bez C #. (O, przepraszam, użyłem tagu C # do tego pytania)
John

możesz utworzyć pętlę javascript, która wykona zadanie, a następnie uruchomisz ją w mongoconsole.
ALoR

2
@AndrewOrsich i @JohnSmith opublikowałem scenariusz.
ALoR

2

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

Ten jest bezpieczny do skopiowania i wykonania na mongoshell. Kredyty za wszystkie powyższe odpowiedzi. Po prostu wyklucz również bazę danych „config”.


-2

To jest tak proste, jak

mongo --eval 'db.dropDatabase()'

Możesz też rozpocząć sesję mongo na swoim terminalu i pisać

db.dropDatabase()

Dokładnie tak samo.


Pytanie brzmi, jak usunąć wszystkie bazy danych, a nie jedną indywidualną
Rob H
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.