8

我是 node.js 和 mongodb 的新手,我有以下问题:我需要从 node.js 文件中删除我的 mongodb 中的所有集合。我有这样的功能:

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

不知道现在该做什么。我会非常感谢你的帮助。

4

3 回答 3

7

如果只删除整个数据库,不是更快、更容易、更不容易出错吗?

db.dropDatabase();

至少在 Mongo CLI 中,每当您访问不存在的数据库时,它都会在您创建数据后被持久化。这与从中删除所有集合相同。

除了学习,我还没有尝试过 MongoDB,所以我对权限不太了解。因此,删除整个数据库的唯一问题可能是您的用户的权限会丢失(我相信)。

如果您尝试创建的此脚本不是用于生产,那么您最好删除数据库。

于 2013-07-08T19:53:47.693 回答
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");
        }    
    } 
}

希望它会帮助别人!

于 2013-07-10T10:05:56.363 回答
0

listCollections给你一个集合名称数组作为字符串。

看起来您可能会将它与返回集合对象数组的东西混淆,例如db.collections()

于 2013-07-09T02:47:57.903 回答