MongoDB her veritabanını bırak


97

MongoDB'mden her veritabanını bırakma komutu olup olmadığını bilmek isterim?

Sadece bir datatable bırakmak isteyip istemediğimi biliyorum, sadece aşağıdaki kod gibi veritabanının adını yazmam gerekiyor ama belirtmek zorunda kalmak istemiyorum.

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

Yanıtlar:


144

işi yapan ve ardından mongoconsole'da yürüten bir javascript döngüsü oluşturabilirsin.

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

dropall.js'ye kaydedin ve ardından çalıştırın:

mongo dropall.js

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

3
Ayrıca yukarıdaki kodu kopyalayıp mongo konsoluna yazabilirsiniz.
Vivek Pandey

2
Bu, sistem veritabanımı düşürdü (Mongo Sürüm 2.4.3). Tekrar çalışması için mongodb sürecini yeniden başlatmak zorunda kaldım.
Felix Schmidt

7
Bence birisi veritabanlarını bırakmak istediğinde, yönetici ve yerel gibi mongo dahili veritabanlarını bırakmak istemiyorlar.
carlin.scott

Ayrıca, işlemlerin depolandığı yapılandırma veritabanı.
Rodrigo Pereira Fraga

106

Bu komutu deneyin:

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

1
Harika çalışıyor ve bunun için bir js dosyası oluşturmanız gerekmiyor. Güzel.
Erik Honn

Yüklemek için simetrik nedir?
nha

Az önce bulduğum bu yaklaşımla ilgili bir sorun, db var'ın mongo konsol oturumları boyunca devam etmesidir, bu nedenle birisi veritabanlarından biriyle etkileşime giriyorsa, db.getSiblingDB çağrısı tarafından dışlanacaktır.
carlin.scott

3
Güzel. Bu Docker için mükemmel: Ddocker exec mongodb sh -c "mongo --quiet --eval 'db.getMongo().getDBNames().forEach(function(i){db.getSiblingDB(i).dropDatabase()})'"
perezmlal

Aynı sorunu yaşadım ve bunun otomasyon görevleri için en iyi çözüm olduğunu öğrendim. Yeni dosyalar yazmak ve bir CI / CD ardışık
düzeninde

22

Bunu basit bir mongo komutuyla da yapabilirsiniz:

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

Her DB için if koşulu yazmak yerine, basitçe bir dizi koyabilir ve indexOf yapabiliriz.
Sachin Gupta

7

Bunu drop_all_dbs.js'ye kaydedin:

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

Şimdi çalıştırabilirsiniz:

mongo drop_all_dbs.js

ve tüm veritabanları (yönetici ve yerel hariç) kaldırılacaktır.

Bu cevap ALoR'un bir kopyasıdır, sadece sistem dbs düşüşünü düzeltin


6

@ ALoR'un cevabına ekleyerek, kolaylık sağlamak için aşağıdakileri ~ / .mongorc.js içine koyabilirsiniz.

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

Daha sonra mongo kabuğunda basitçe yapabilirsiniz

dropDatabases()

Dokümanlardan:

Mongo, mongo'yu çağıran kullanıcının ev dizininden .mongorc.js dosyasını okuyacaktır. Dosyada, kullanıcılar değişkenleri tanımlayabilir, mongo kabuk istemini özelleştirebilir veya bir kabuk başlattıklarında güncellenmesini istedikleri bilgileri güncelleyebilirler.


Sorunları düzeltmek için güncellemeler yaptım. Geldiğiniz için teşekkürler!
btiernay

4

Bunu c # resmi sürücüsü aracılığıyla kolayca yapabilirsiniz:

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

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

evet bir fikir olabilir, ancak bunu C # olmadan yapmak istiyorum. (Üzgünüm, bu soru için C # etiketini kullandım)
John

işi yapan ve ardından bunu mongoconsole'da yürüten bir javascript döngüsü oluşturabilirsiniz.
ALoR

2
@AndrewOrsich ve @JohnSmith senaryoyu yayınladım.
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(); });

Bunu kopyalamak ve mongoshell üzerinde çalıştırmak güvenlidir. Yukarıdaki tüm yanıtların kredisi. Sadece 'yapılandırma' veritabanını da hariç tutun.


-2

Kadar kolay

mongo --eval 'db.dropDatabase()'

Veya terminalinizde bir mongo oturumu başlatabilir ve yazabilirsiniz.

db.dropDatabase()

Hangisi tamamen aynı.


Soru, tek bir veritabanının değil, tüm veritabanlarının nasıl
Rob H
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.