2012-10-11 116 views
8

我已經重構了我的數據庫,不再需要某些集合。但是,其中有太多的數據需要手動移除(實際上有數千個)。每個有問題的集合都以「cache_」開頭,幷包含一些我想確保完全清理的索引。MongoDB:刪除名稱與字符串匹配的所有集合

我想了解如何使用mongo shell來遍歷所有集合名稱並刪除以「cache_」開頭的集合。根據Queries & Cursors documentation,我瞭解如何遍歷集合中的文檔,但不知道如何使用MongoDB shell循環訪問數據庫中的集合。

在僞代碼,這是我需要的:

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

FWIW,我已經做了「通過集合名稱MongoDB的循環」搜索等,並沒有發現任何東西,但也許我在SUX teh googlez = P

在相關說明中......在完成這個重組程度之後,我應該做一個db.repairDatabase()或者其他什麼類型的操作來確保刪除的索引等都很好,乾淨嗎?

謝謝。

回答

20

使用db.getCollectionNames()獲取所有集合並將它們存儲在一個數組中。

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,謝謝。我想我不知道「show collections」=>「db.getCollectionNames();」 –

+0

** db [collectionName] **是這裏的關鍵。 _Javascript對RoboMongo_ '變種集合= [ 'collection1', 'collection2'] collections.forEach(函數(coll_name){ 打印(coll_name) 分貝[coll_name] .drop() })' – Abhijeet

1

我想補充另一個答案發現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(); 
}) 

你可能想正如我上面列出的不刪除本地/配置/管理DBS。

+0

我執行did:'使用toto'然後'db.getSiblingDB(「mydb」)。dropDatabase();'thx – Maxence

0

以下工作對我來說很好,可以刪除由map reduce作業創建的集合。在我的情況下,他們被自動刪除在本地設置,但無論出於什麼原因卡在服務器上。

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

這類似於NISHANT的答案,但不同的是,我沒有管理員權限,無法調用db.adminCommand(託管蒙戈實例)。

相關問題