2014-09-06 47 views
0

我不小心創建了兩個同名的數據庫。當我在蒙戈外殼做show dbs,我得到這個:如何刪除與填充數據庫具有相同名稱的空Mongo數據庫?

> show dbs 
admin (empty) 
local 0.078GB 
example_development (empty) 
example_development 0.078GB 

有沒有辦法刪除空數據庫,而不與填充的一個篡改?

+0

這應該是不可能的。你能編輯你的問題來包含來自'db.adminCommand('listDatabases')'的輸出嗎? – JohnnyHK 2014-09-06 03:02:48

回答

1

數據庫名稱不一樣,只是它有一個非打印字符,mongo shell的javascript接口爲你壓制。

在mongo中,驅動程序必須確保用戶無法向服務器提交非標準數據,但是it has been demonstrated BSON在其可以存儲的內容中非常靈活。

由於您在談論整個數據庫,解決此問題的最簡單方法是關閉mongo並刪除數據庫文件。您可以通過db.serverCmdLineOpts()命令找到這些文件的位置。

0

Wes Widner answer is correct因爲你很可能有一個不可打印的字符。但是,我並不是直接從文件系統中刪除文件,而是更傾向於使用程序化方法。他們這裏的關鍵是從來沒有真正被它的字面名稱調用數據庫,而是保持一個參考變量形式的名稱:

  1. 列出所有數據庫
  2. 篩選這些數據庫,以匹配你正在尋找的標準
  3. 變換結果列表中(陣)轉換爲數據庫名稱
  4. 選擇有問題DB的具體指標(我不能想出一個辦法,通過每個所得到的數據庫進行迭代和應用getSiblingDB他們每個人) 。
  5. 傳遞到db.getSiblingDB並出具db.dropDatabase

工作實例

use bogus; 
db.createCollection('blah'); 
db.getCollectionNames(); // [ "blah", "system.indexes" ] 

use admin; 
db.adminCommand({listDatabases:1}).databases.filter(function(d){ 
    return d.name === 'bogus'; 
}).map(function(d){ 
    return d.name; 
}); // [ "bogus" ] 


// use [0] here since we now 'bogus' was at index 0 in previous 
// getSiblingDB will allow us to issue dropDatabase on the string 
// representation of the database 
db.getSiblingDB(db.adminCommand({listDatabases:1}).databases.filter(function(d){ 
    return d.name === 'bogus'; 
}).map(function(d){ 
    return d.name; 
})[0]).dropDatabase(); 

裁縫到您的問題

,而不是由專門name過濾,我們想通過sizeOnDisk過濾。請務必不要在此處選擇「管理員」,因此首先使用過濾器/映射運行adminCommand以獲取適用的索引。機會是「管理員」將在索引0,所以你的數據庫很可能會在索引1:

db.getSiblingDB(db.adminCommand({listDatabases:1}).databases.filter(function(d){ 
    return !d.sizeOnDisk; 
}).map(function(d){ 
    return d.name; 
})[1]).dropDatabase(); // note usage of [1] here 
相關問題