MongoDB menjatuhkan setiap database

97

Saya ingin tahu apakah ada perintah untuk menghapus setiap database dari MongoDB saya?

Saya tahu jika saya ingin menghapus hanya satu dataTable, saya hanya perlu mengetikkan nama database seperti kode di bawah ini tetapi saya tidak ingin menentukannya.

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

Jawaban:

143

Anda dapat membuat loop javascript yang melakukan pekerjaan itu dan kemudian menjalankannya di mongoconsole.

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

simpan ke dropall.js lalu jalankan:

mongo dropall.js
ALoR
sumber
13
var mongo = db.getMongo(); mongo.getDBNames().forEach(function (dbname) { var db = mongo.getDB(dbname); db.dropDatabase(); });
tjmehta
3
Anda juga bisa menyalin dan menempelkan kode di atas dan mengetiknya di konsol mongo.
Vivek Pandey
2
Ini menjatuhkan database sistem saya (Mongo Version 2.4.3). Saya harus memulai ulang proses mongodb untuk membuatnya berfungsi kembali.
Felix Schmidt
7
Saya pikir ketika seseorang ingin menjatuhkan database mereka, mereka tidak ingin menjatuhkan database internal mongo seperti admin dan lokal.
carlin.scott
Juga, database config, tempat transaksi disimpan.
Rodrigo Pereira Fraga
103

Coba perintah ini:

mongo --quiet --eval 'db.getMongo().getDBNames().forEach(function(i){db.getSiblingDB(i).dropDatabase()})'
kev
sumber
1
Berfungsi dengan baik, dan Anda tidak perlu membuat file js untuk itu. Bagus.
Erik Honn
Apa simetris untuk memuatnya?
nha
Satu masalah dengan pendekatan ini yang baru saya temukan adalah bahwa db var bertahan melalui sesi konsol mongo jadi jika seseorang berinteraksi dengan salah satu database maka itu akan dikecualikan oleh panggilan db.getSiblingDB.
carlin.scott
3
Bagus. Ini sempurna untuk Docker: Ddocker exec mongodb sh -c "mongo --quiet --eval 'db.getMongo().getDBNames().forEach(function(i){db.getSiblingDB(i).dropDatabase()})'"
perezmlal
Saya mengalami masalah yang sama dan saya menemukan ini adalah solusi terbaik untuk tugas otomatisasi. Anda tidak ingin menulis file baru dan mendownload dalam pipeline CI / CD sehingga skrip satu baris sangat mudah dikelola
Carmine Ingaldi
21

Anda juga dapat melakukan ini dengan perintah mongo sederhana:

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
sumber
Alih-alih menulis kondisi if untuk setiap DB, kita dapat dengan mudah memasukkan array dan melakukan indexOf.
Sachin Gupta
5

Menambahkan jawaban @ ALoR, untuk kenyamanan Anda dapat meletakkan berikut ini di ~ / .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();
    }
}

Kemudian di cangkang mongo bisa langsung Anda lakukan

dropDatabases()

Dari dokumen:

Mongo akan membaca file .mongorc.js dari direktori home pengguna yang memanggil mongo. Dalam file tersebut, pengguna dapat menentukan variabel, menyesuaikan prompt mongo shell, atau memperbarui informasi yang ingin mereka perbarui setiap kali mereka meluncurkan shell.

btiernay
sumber
Saya telah melakukan pembaruan untuk memperbaiki masalah. Terima kasih telah bergabung!
btiernay
5

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

Sekarang Anda dapat menjalankan:

mongo drop_all_dbs.js

dan semua database (kecuali admin dan lokal) akan dihapus.

Jawaban ini adalah salinan dari ALoR, cukup perbaiki penurunan dbs sistem

Gas
sumber
4

Anda dapat melakukannya dengan mudah melalui c # driver resmi:

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

var names = _mongoServer.GetDatabaseNames();
foreach (var name in names)
{
   _mongoServer.DropDatabase(name);
}
Andrew Orsich
sumber
ya itu bisa jadi ide, tapi saya ingin melakukannya tanpa C #. (Oh maaf, saya menggunakan tag C # untuk pertanyaan ini)
John
Anda dapat membuat loop javascript yang melakukan pekerjaan itu dan kemudian menjalankannya di mongoconsole.
ALoR
2
@AndrewOrsich dan @JohnSmith saya telah memposting skripnya.
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(); });

Yang ini aman untuk disalin dan dijalankan di mongoshell. Penghargaan untuk semua jawaban di atas. Cukup kecualikan database 'config' juga.

vu le
sumber
-2

Semudah itu

mongo --eval 'db.dropDatabase()'

Atau, Anda dapat memulai sesi mongo di terminal Anda dan menulis

db.dropDatabase()

Yang persis sama.

Pedro José Piquero Plaza
sumber
Pertanyaannya adalah bagaimana menghapus semua database, bukan satu individu
Rob H