113

Node.jsとMongooseでデータベース作成スクリプトを準備中です。データベースが既に存在するかどうかを確認するにはどうすればよいですか?存在する場合は、Mongoose を使用してドロップ (削除) しますか?

Mongoose でドロップする方法が見つかりませんでした。

4

16 に答える 16

177

コレクションをマングースから削除する方法はありません。できる最善の方法は、コレクションのコンテンツを削除することです。

Model.remove({}, function(err) { 
   console.log('collection removed') 
});

しかし、これに使用できるmongodbネイティブjavascriptドライバーにアクセスする方法があります

mongoose.connection.collections['collectionName'].drop( function(err) {
    console.log('collection dropped');
});

警告

何か問題が発生した場合に備えて、これを試す前にバックアップを作成してください。

于 2012-04-10T12:01:32.837 に答える
95

Mongooseは、接続時にデータベースがまだ存在しない場合にデータベースを作成するため、接続を確立したら、データベースにクエリを実行して、データベースに何かがあるかどうかを確認できます。

接続している任意のデータベースを削除できます。

var mongoose = require('mongoose');
/* Connect to the DB */
mongoose.connect('mongodb://localhost/mydatabase',function(){
    /* Drop the DB */
    mongoose.connection.db.dropDatabase();
});
于 2012-04-29T02:25:06.163 に答える
16

このように@hellslamのソリューションを変更すると、うまくいきます

この手法を使用して、統合テスト後にデータベースを削除します

//CoffeeScript
mongoose = require "mongoose"
conn = mongoose.connect("mongodb://localhost/mydb")

conn.connection.db.dropDatabase()

//JavaScript
var conn, mongoose;
mongoose = require("mongoose");
conn = mongoose.connect("mongodb://localhost/mydb");

conn.connection.db.dropDatabase();

HTH 少なくとも私には効果があったので、共有することにしました =)

于 2012-06-04T14:35:15.450 に答える
9

@hellslam と @silverfighter の回答を試しました。テストを妨げている競合状態が見つかりました。私の場合、モカ テストを実行しており、テストの before 関数で DB 全体を消去したいと考えています。これが私にとってうまくいくものです。

var con = mongoose.connect('mongodb://localhost/mydatabase');
mongoose.connection.on('open', function(){
    con.connection.db.dropDatabase(function(err, result){
        done();
    });
});

詳細を読むことができますhttps://github.com/Automattic/mongoose/issues/1469

于 2015-07-12T21:27:37.850 に答える
5

これは、Mongooseの時点で機能しますv4.7.0

mongoose.connection.dropDatabase();
于 2016-11-30T00:17:26.757 に答える
5

他のソリューションで私が抱えていた問題は、インデックスを再び機能させたい場合、アプリケーションの再起動に依存していることです。

私のニーズ(つまり、すべてのコレクションを核攻撃し、それらをインデックスとともに再作成するユニットテストを実行できるようにすること)のために、私はこのソリューションを実装することになりました:

これは、インデックスを並列にアセンブルするためにunderscore.jsおよびasync.jsライブラリに依存しています。そのライブラリに反対している場合は巻き戻される可能性がありますが、開発者の演習として残します。

mongoose.connection.db.executeDbCommand( {dropDatabase:1}, function(err, result) {
  var mongoPath = mongoose.connections[0].host + ':' + mongoose.connections[0].port + '/' + mongoose.connections[0].name
  //Kill the current connection, then re-establish it
  mongoose.connection.close()
  mongoose.connect('mongodb://' + mongoPath, function(err){
    var asyncFunctions = []

    //Loop through all the known schemas, and execute an ensureIndex to make sure we're clean
    _.each(mongoose.connections[0].base.modelSchemas, function(schema, key) {
      asyncFunctions.push(function(cb){
        mongoose.model(key, schema).ensureIndexes(function(){
          return cb()
        })
      })
    })

    async.parallel(asyncFunctions, function(err) {
      console.log('Done dumping all collections and recreating indexes')
    })
  })
})
于 2013-03-27T19:26:29.037 に答える
4

データベース内の特定のコレクションを空にするには:

model.remove(function(err, p){
    if(err){ 
        throw err;
    } else{
        console.log('No Of Documents deleted:' + p);
    }
});

ノート:

  1. 特定のスキーマ (削除するコレクションのスキーマ) を参照するモデルを選択します。
  2. この操作では、コレクション名はデータベースから削除されません。
  3. これにより、コレクション内のすべてのドキュメントが削除されます。
于 2013-07-03T12:48:51.540 に答える
1

コレクション内のすべてのドキュメントを削除するには:

await mongoose.connection.db.dropDatabase();

この回答は、mongoose index.d.ts ファイルに基づいています。

dropDatabase(): Promise<any>;
于 2020-06-07T16:37:42.647 に答える
-2

コレクション内のすべてのドキュメントを削除する場合:

myMongooseModel.collection.drop();

テストで見られるように

于 2017-04-06T00:09:43.413 に答える