2012-10-11 30 views
8

Tôi đã cấu trúc lại cơ sở dữ liệu của mình một chút và không còn cần bộ sưu tập nhất định nữa. Tuy nhiên, có quá nhiều người trong số họ để loại bỏ bằng tay (hàng ngàn, thực sự). Mỗi bộ sưu tập được đề cập bắt đầu bằng "cache_" và chứa một vài chỉ mục mà tôi muốn đảm bảo hoàn toàn được dọn sạch.MongoDB: Xóa tất cả các bộ sưu tập có tên khớp với một chuỗi

Tôi đang cố gắng hiểu cách sử dụng vỏ mongo để lặp qua tất cả các tên bộ sưu tập và xóa những bộ sưu tập bắt đầu bằng "cache_". Theo số Queries & Cursors documentation, tôi hiểu cách lặp qua các tài liệu trong một bộ sưu tập, nhưng không phải cách sử dụng trình bao MongoDB để lặp qua các bộ sưu tập trong cơ sở dữ liệu.

Trong pseudo-code, đây là những gì tôi cần:

var all_collections = show collections 
for(var collection in all_collections) 
    if(collection.name.indexOf('cache_')==0) 
     collection.drop() 

FWIW, tôi đã thực hiện tìm kiếm "loop MongoDB qua tên bộ sưu tập" vv và đã không tìm thấy bất cứ điều gì, nhưng có lẽ tôi sux tại teh googlez = P

Trên ghi chú liên quan ... sau khi thực hiện việc tái cơ cấu này, tôi có nên thực hiện db.repairDatabase() hoặc bất kỳ thứ gì sắp xếp để đảm bảo các chỉ mục bị xóa vv đều đẹp và sạch?

Cảm ơn.

Trả lời

20

Sử dụng db.getCollectionNames() để nhận tất cả các bộ sưu tập và lưu trữ chúng trong một mảng.

var collectionNames = db.getCollectionNames(); 
for(var i = 0, len = collectionNames.length; i < len ; i++){ 
    var collectionName = collectionNames[i]; 
    if(collectionName.indexOf('cache_') == 0){ 
     db[collectionName].drop() 
    } 
} 
+1

FTW, cảm ơn. Tôi đoán tôi không biết rằng "show collections" => "db.getCollectionNames();" –

+0

** db [collectionName] ** là khóa ở đây. _Javascript để thực thi trên RoboMongo_ 'var bộ sưu tập = [ 'collection1', 'collection2'] collections.forEach (function (coll_name) { in (coll_name) db [coll_name] .drop() }) ' – Abhijeet

1

Chỉ cần thêm câu trả lời khác tìm thấy on mongodb mailing list

db.adminCommand("listDatabases").databases.forEach(function (d) { 
    if (d.name != "local" && d.name != "admin" && d.name != "config") 
    db.getSiblingDB(d.name).dropDatabase(); 
}) 

Bạn có thể muốn không thả dbs/config/quản trị cục bộ như tôi đã liệt kê ở trên.

+0

tôi đã làm: 'sử dụng toto' và sau đó' db.getSiblingDB ("mydb"). dropDatabase(); 'thx – Maxence

0

Sau đây đã làm việc tuyệt vời cho tôi để xóa các bộ sưu tập được tạo bởi bản đồ giảm công việc. Trong trường hợp của tôi, chúng đã bị xóa tự động trên thiết lập cục bộ, nhưng vì bất kỳ lý do gì bị kẹt xung quanh trên máy chủ.

db.getCollectionNames().forEach(function (d) { 
    if (d != "collectionICareAbout" && d != "system.indexes" && d != "system.users") { 
     print("dropping: " + d); 
     db[d].drop(); 
    } 
}) 

Điều này tương tự như câu trả lời của Nishant, nhưng sự khác biệt là tôi không có quyền quản trị và không thể gọi db.adminCommand (phiên bản được lưu trữ trên máy chủ).

Các vấn đề liên quan