MongoDB thả mọi cơ sở dữ liệu


97

Tôi muốn biết liệu có lệnh loại bỏ mọi cơ sở dữ liệu khỏi MongoDB của tôi không?

Tôi biết nếu tôi muốn chỉ thả một cơ sở dữ liệu, tôi chỉ cần nhập tên của cơ sở dữ liệu như mã bên dưới nhưng tôi không muốn phải chỉ định nó.

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

Câu trả lời:


142

bạn có thể tạo một vòng lặp javascript để thực hiện công việc và sau đó thực thi nó trong mongoconsole.

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

lưu nó vào dropall.js và sau đó thực thi:

mongo dropall.js

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

3
Bạn cũng có thể chỉ cần sao chép, dán mã ở trên và nhập nó trên bảng điều khiển mongo.
Vivek Pandey

2
Điều này đã làm giảm cơ sở dữ liệu hệ thống của tôi (Phiên bản Mongo 2.4.3). Tôi đã phải khởi động lại quy trình mongodb để làm cho nó hoạt động trở lại.
Felix Schmidt

7
Tôi nghĩ rằng khi ai đó muốn bỏ cơ sở dữ liệu của họ, họ không muốn bỏ cơ sở dữ liệu nội bộ mongo như admin và local.
carlin.scott

Ngoài ra, cơ sở dữ liệu cấu hình, nơi các giao dịch được lưu trữ.
Rodrigo Pereira Fraga

103

Hãy thử lệnh này:

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

1
Hoạt động tuyệt vời và bạn không phải tạo tệp js cho nó. Đẹp.
Erik Honn

Symetric để tải nó là gì?
nha

Một vấn đề với cách tiếp cận này mà tôi vừa tìm thấy là db var vẫn tồn tại qua các phiên giao diện điều khiển mongo vì vậy nếu ai đó đang tương tác với một trong các cơ sở dữ liệu thì nó sẽ bị loại trừ bởi lệnh gọi db.getSiblingDB.
carlin.scott

3
Đẹp. Điều này là hoàn hảo cho Docker: Ddocker exec mongodb sh -c "mongo --quiet --eval 'db.getMongo().getDBNames().forEach(function(i){db.getSiblingDB(i).dropDatabase()})'"
perezmlal

Tôi đã trải qua vấn đề tương tự và tôi phát hiện ra đây là giải pháp tốt nhất cho các tác vụ tự động hóa. Bạn không muốn viết các tệp mới và tải xuống trong đường dẫn CI / CD vì vậy tập lệnh một lớp rất đơn giản để quản lý
Carmine Ingaldi

21

Bạn cũng có thể thực hiện việc này bằng một lệnh mongo đơn giản:

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

Thay vì viết điều kiện if cho mọi DB, chúng ta có thể đơn giản đặt vào một mảng và thực hiện indexOf.
Sachin Gupta

5

Thêm vào câu trả lời của @ ALoR, để thuận tiện, bạn có thể điền phần sau vào ~ / .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();
    }
}

Sau đó, tại trình bao mongo, bạn có thể đơn giản làm

dropDatabases()

Từ các tài liệu:

Mongo sẽ đọc tệp .mongorc.js từ thư mục chính của người dùng đang gọi mongo. Trong tệp, người dùng có thể xác định các biến, tùy chỉnh lời nhắc trình bao mongo hoặc cập nhật thông tin mà họ muốn cập nhật mỗi khi khởi chạy trình bao.


Tôi đã cập nhật để sửa các vấn đề. Cảm ơn bạn đã gọi điện!
btiernay

5

Lưu cái này vào 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();
}

Bây giờ bạn có thể thực thi:

mongo drop_all_dbs.js

và tất cả cơ sở dữ liệu (ngoại trừ quản trị và cục bộ) sẽ bị xóa.

Câu trả lời này là bản sao của câu trả lời ALoR, chỉ cần sửa lỗi thả dbs hệ thống


4

Bạn có thể làm điều đó dễ dàng thông qua trình điều khiển chính thức c #:

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

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

vâng nó có thể là một ý tưởng, nhưng tôi muốn thực hiện nó mà không cần C #. (Oh xin lỗi, tôi đã sử dụng thẻ C # cho câu hỏi này)
John

bạn có thể tạo một vòng lặp javascript để thực hiện công việc và sau đó thực thi nó trong mongoconsole.
ALoR

2
@AndrewOrsich và @JohnSmith tôi đã đăng tập lệnh.
ALoR

1

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

Cái này an toàn để sao chép và thực thi trên mongoshell. Tín dụng cho tất cả các câu trả lời ở trên. Chỉ cần loại trừ cơ sở dữ liệu 'cấu hình'.


-2

Nó dễ dàng như

mongo --eval 'db.dropDatabase()'

Hoặc, bạn có thể bắt đầu một phiên mongo trên thiết bị đầu cuối của mình và viết

db.dropDatabase()

Mà hoàn toàn giống nhau.


Câu hỏi đặt ra là làm thế nào để vứt bỏ mọi cơ sở dữ liệu, không phải là một cá nhân
Rob H
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.