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();'
Jan
źródło

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
ALoR
źródło
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()})'
kev
źródło
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();
 })
Andreas
źródło
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

Gaz
źródło
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ę.

btiernay
źródło
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);
}
Andrew Orsich
źródło
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”.

vu le
źródło
-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.

Pedro José Piquero Plaza
źródło
Pytanie brzmi, jak usunąć wszystkie bazy danych, a nie jedną indywidualną
Rob H