MongoDB ทิ้งทุกฐานข้อมูล


98

ฉันต้องการทราบว่ามีคำสั่งให้ทิ้งฐานข้อมูลทั้งหมดจาก MongoDB ของฉันหรือไม่?

ฉันรู้ว่าฉันต้องการวางข้อมูลเพียงรายการเดียวฉันต้องพิมพ์ชื่อของฐานข้อมูลเหมือนรหัสด้านล่าง แต่ฉันไม่ต้องการระบุ

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

คำตอบ:


144

คุณสามารถสร้าง javascript loop ที่ทำงานแล้วเรียกใช้งานใน mongoconsole

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 จากนั้นดำเนินการ:

mongo dropall.js

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

3
คุณยังสามารถคัดลอกวางโค้ดด้านบนแล้วพิมพ์ลงบนคอนโซล mongo
Vivek Pandey

2
สิ่งนี้ทำให้ฐานข้อมูลระบบของฉันลดลง (Mongo เวอร์ชัน 2.4.3) ฉันต้องรีสตาร์ทกระบวนการ mongodb เพื่อให้มันใช้งานได้อีกครั้ง
Felix Schmidt

7
ฉันคิดว่าเมื่อมีคนต้องการวางฐานข้อมูลพวกเขาไม่ต้องการทิ้งฐานข้อมูลภายในของ Mongo เช่นผู้ดูแลระบบและท้องถิ่น
carlin.scott

นอกจากนี้ฐานข้อมูล config ที่จัดเก็บธุรกรรม
Rodrigo Pereira Fraga

108

ลองใช้คำสั่งนี้:

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

1
ใช้งานได้ดีและคุณไม่จำเป็นต้องสร้างไฟล์ js ขึ้นมา ดี.
Erik Honn

symetric ที่จะโหลดคืออะไร?
nha

ปัญหาหนึ่งของวิธีการนี้ที่ฉันเพิ่งพบคือ db var ยังคงอยู่ผ่านเซสชันคอนโซล Mongo ดังนั้นหากมีคนโต้ตอบกับฐานข้อมูลใดฐานข้อมูลนั้นจะถูกยกเว้นโดยการเรียก db.getSiblingDB
carlin.scott

3
ดี. เหมาะสำหรับ Docker: Ddocker exec mongodb sh -c "mongo --quiet --eval 'db.getMongo().getDBNames().forEach(function(i){db.getSiblingDB(i).dropDatabase()})'"
perezmlal

ฉันประสบปัญหาเดียวกันและพบว่านี่เป็นทางออกที่ดีที่สุดสำหรับงานระบบอัตโนมัติ คุณไม่กระตือรือร้นที่จะเขียนไฟล์ใหม่และดาวน์โหลดในไปป์ไลน์ CI / CD ดังนั้นสคริปต์ซับเดียวจึงจัดการได้ง่ายมาก
Carmine Ingaldi

23

คุณสามารถทำได้ด้วยคำสั่ง 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();
 })

แทนที่จะเขียน if condition สำหรับทุก DB เราสามารถใส่อาร์เรย์และทำ indexOf ได้ง่ายๆ
Sachin Gupta

7

บันทึกลงใน 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();
}

ตอนนี้คุณสามารถดำเนินการ:

mongo drop_all_dbs.js

และฐานข้อมูลทั้งหมด (ยกเว้นสำหรับผู้ดูแลระบบและท้องถิ่น) จะถูกทิ้ง

คำตอบนี้เป็นสำเนาของ ALoR เพียงแก้ไขการลดลงของ dbs ระบบ


6

การเพิ่มคำตอบของ @ ALoR เพื่อความสะดวกคุณสามารถใส่สิ่งต่อไปนี้ใน~ / .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();
    }
}

จากนั้นที่เปลือก mongo คุณสามารถทำได้

dropDatabases()

จากเอกสาร:

Mongo จะอ่านไฟล์ .mongorc.js จากโฮมไดเร็กทอรีของผู้ใช้ที่เรียกใช้ mongo ในไฟล์ผู้ใช้สามารถกำหนดตัวแปรปรับแต่งพรอมต์ mongo shell หรืออัปเดตข้อมูลที่ต้องการอัปเดตทุกครั้งที่เปิดเชลล์


ฉันได้ทำการอัปเดตเพื่อแก้ไขปัญหาแล้ว ขอบคุณสำหรับการเข้าร่วม!
btiernay

4

คุณสามารถทำได้อย่างง่ายดายผ่านไดรเวอร์ c # อย่างเป็นทางการ:

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

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

ใช่มันอาจเป็นความคิด แต่ฉันต้องการทำโดยไม่ใช้ C # (ขออภัยฉันใช้แท็ก C # สำหรับคำถามนี้)
John

คุณสามารถสร้าง javascript loop ที่ทำงานแล้วเรียกใช้งานใน mongoconsole
ALoR

2
@AndrewOrsich และ @JohnSmith ฉันโพสต์สคริปต์แล้ว
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(); });

อันนี้ปลอดภัยที่จะคัดลอกและดำเนินการบน mongoshell เครดิตสำหรับคำตอบทั้งหมดข้างต้น ไม่รวมฐานข้อมูล 'config' ด้วย


-2

มันง่ายพอ ๆ

mongo --eval 'db.dropDatabase()'

หรือคุณสามารถเริ่มเซสชัน Mongo บนเทอร์มินัลของคุณแล้วเขียน

db.dropDatabase()

ซึ่งก็เหมือนกันเป๊ะ.


คำถามคือจะทิ้งฐานข้อมูลทั้งหมดได้อย่างไรไม่ใช่แบบเดี่ยว
Rob H
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.