2013-07-08 47 views
8

我是新來的node.js和mongodb,我有以下問題: 我需要從node.js文件中刪除我的mongodb中的所有集合。我有這樣一個功能:如何通過mongodb和node.js刪除所有集合?

service.dropCollections = function(db, colls){ 
    for(var i = 0; i < colls.length; i++){ 
    var name = colls[i].name; 
    db.dropCollection(name, function(err) { 
     if(!err) { 
      console.log(name + " dropped"); 
     } else { 
      console.log("!ERROR! " + err.errmsg); 
     } 
    }); 
    } 
} 

,我在下面的函數中使用它:

service.clearDB = function() { 
var MongoClient = require('mongodb').MongoClient 
, format = require('util').format;  

    MongoClient.connect('mongodb://127.0.0.1:27017/shiny_d', function(err, db){ 
    if(err) throw err; 
    db.collectionNames(function(err, collections){ 
     if(!err){ 
      service.dropCollections(db, collections); 
     } else { 
      console.log("!ERROR! "+ err.errmsg); 
     } 
     service.showCollections(); 
    }); 
    }); 
} 

作爲輸出我有

錯誤! NS沒有找到

shiny_db.physicalinfos

說不上來,現在該怎麼辦。我會非常感謝你的幫助。

+0

不要刪除以'system'開頭的任何內容,因爲這些內容是爲MongoDB保留的。 – WiredPrairie

+0

你可以告訴我,以避免它們? –

+0

只需檢查字符串是否以'system'開頭。 – WiredPrairie

回答

3

我找到了答案數組被混淆了。首先,我在我的連接中犯了錯誤,應該如下所示:'mongodb://127.0.0.1:27017/shiny_db'。第二個錯誤是以收集爲名。這就像'db_name.coll_name',這就是爲什麼db.dropCollection(name, callback)找不到特定的收集,因爲它我錯了ns not found。所以我用下面的機制將db_name與coll_name分開:

var name = colls[i].name.substring('shiny_db.'.length);我添加了對「系統」集合的檢查。

最終代碼看起來像以下:

service.clearDB = function() { 
    var MongoClient = require('mongodb').MongoClient 
    , format = require('util').format;  

    MongoClient.connect('mongodb://localhost/shiny_db', function(err, db) { 
     if(err) throw err; 
     db.collectionNames(function(err, collections){ 
      if(!err){ 
       service.dropCollections(db, collections);     
      } else { 
       console.log("!ERROR! "+ err.errmsg); 
      } 
     }); 
    }); 
} 
service.dropCollections = function(db, colls){ 
    for(var i = 0; i < colls.length; i++){ 
     var name = colls[i].name.substring('shiny_db.'.length); 

     if (name.substring(0, 6) !== "system") { 
      db.dropCollection(name, function(err) { 
       if(!err) { 
        console.log(name + " dropped"); 
       } else { 
        console.log("!ERROR! " + err.errmsg); 
       } 
      }); 
     } else { 
      console.log(name + " cannot be dropped because it's a system file"); 
     }  
    } 
} 

希望這將幫助別人!

7

如果您只刪除整個數據庫,是不是更快,更容易,更不容易出錯?

db.dropDatabase(); 

在從蒙戈CLI,當你訪問一個不存在的DB至少,它會創建數據即將依然存在。這與從中刪除所有集合是一樣的。

我還沒有嘗試MongoDB的任何東西,除了學習,所以我不太瞭解許可。因此,丟掉整個數據庫的唯一問題可能是您的用戶的權限將會丟失(我相信)。

如果您嘗試創建的這個腳本不適用於生產,那麼您最好放棄數據庫。

+0

好吧,這不是我的目標;) –

0

listCollections爲您提供了一個集合名稱作爲字符串的數組。

它看起來像你可能有一些返回的集合對象一樣,也許db.collections()

+0

但是,定義集合名稱有什麼區別?我只需要集合的名稱將它們用作'db.dropCollection(name,callback)' –

+0

中的參數,如果它返回了需要使用obj.name來獲取名稱的對象。如果它給了你名字,你就不應該使用name.name。 –

+0

那麼,我已經檢查過'collectionNames'返回了什麼,它返回一個帶有對象的集合,它有一個字段「name」。但是你的回答給我帶來了一個成功的想法,非常感謝! –

相關問題