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 からは、存在しない DB にアクセスするたびに、データを作成するとすぐに永続化されます。それは、そこからすべてのコレクションを削除することと同じです。

MongoDB はまだ勉強以外で試したことがないので、権限についてはよくわかりません。したがって、おそらくDB全体を削除する唯一の問題は、ユーザーの権限が失われることです(私は信じています)。

作成しようとしているこのスクリプトが本番用でない場合は、DB を削除しても問題ありません。

于 2013-07-08T19:53:47.693 に答える
3

答えが見つかりました。まず、接続を間違えました。次のようになります'mongodb://127.0.0.1:27017/shiny_db'。2 つ目の間違いは、コレクションの名前にありました。それが'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 に答える