node.js - サンプル - Mongooseでデータベースを削除するには?



mongodb (8)

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

接続しているデータベースはすべて削除できます。

var mongoose = require('mongoose');
/* Connect to the DB */
mongoose.connect('mongodb://localhost/mydatabase',function(){
    /* Drop the DB */
    mongoose.connection.db.dropDatabase();
});

https://ffff65535.com

私はNode.jsとMongooseでデータベース作成スクリプトを準備しています。 データベースが既に存在するかどうかを確認する方法はありますか?もしそうなら、Mongooseを使用してデータベースを削除(削除)しますか?

私はモングースでそれをドロップする方法を見つけることができませんでした。


mongooseからコレクションを削除する方法はありません。あなたができることは、その内容を削除することです。

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

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

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

警告

何かがうまくいかない場合に備えて、これを試す前にバックアップを作成してください!


あなたがこのような@ 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は少なくとも私のためにしたので、私は=を共有することに決めました)


これはMongoose v4.7.0私のためにv4.7.0

mongoose.connection.dropDatabase();

データベースをMongooseにドロップする最良の方法は、使用しているMongooseのバージョンによって異なります。 4.6.4以降のバージョンのMongooseを使用している場合は、この方法を追加すると、あなたのためにうまくいく可能性があります:

mongoose.connection.dropDatabase();

古いリリースでは、このメソッドは存在しませんでした。 代わりに、直接MongoDB呼び出しを使用しました。

mongoose.connection.db.dropDatabase();

ただし、これがデータベース接続の作成直後に実行された場合は、自動的に失敗する可能性があります。 これは、実際には非同期であり、コマンドの実行時にまだ設定されていない接続に関連しています。 .find()ような他のMongoose呼び出しでは、これは通常問題ではなく、接続がオープンされてから実行されるまで待ちます。

追加されたdropDatabase()ショートカットのソースコードを見ると、この正確な問題を解決するように設計されていることがわかります。 接続が開いて準備が整っているかどうかを確認します。 もしそうなら、すぐにコマンドを起動します。 そうでない場合は、データベース接続が開かれたときに実行するコマンドを登録します。

上記の提案の中には、 常にあなたのdropDatabaseコマンドをopenハンドラに入れることを推奨するものがあります。 しかし、それはまだ接続が開いていない場合にのみ動作します。

Connection.prototype.dropDatabase = function(callback) {
  var Promise = PromiseProvider.get();
  var _this = this;
  var promise = new Promise.ES6(function(resolve, reject) {
    if (_this.readyState !== STATES.connected) {
      _this.on('open', function() {
        _this.db.dropDatabase(function(error) {
          if (error) {
            reject(error);
          } else {
            resolve();
          }
        });
      });
    } else {
      _this.db.dropDatabase(function(error) {
        if (error) {
          reject(error);
        } else {
          resolve();
        }
      });
    }
  });
  if (callback) {
    promise.then(function() { callback(); }, callback);
  }
  return promise;
};

以前のMongooseのバージョンで使用できる上記のロジックの簡単なバージョンです:

// This shim is backported from Mongoose 4.6.4 to reliably drop a database
// http://.com/a/42860208/254318
// The first arg should be "mongoose.connection"
function dropDatabase (connection, callback) {
    // readyState 1 === 'connected'
    if (connection.readyState !== 1) {
      connection.on('open', function() {
        connection.db.dropDatabase(callback);
      });
    } else {
      connection.db.dropDatabase(callback);
    }
}  

マングース4.6.0+:

mongoose.connect('mongodb://localhost/mydb')
mongoose.connection.once('connected', () => {
    mongoose.connection.db.dropDatabase();
});

接続のコールバックを渡すことはもうできません:

TypeError:nullのプロパティ 'commandsTakeWriteConcern'を読み取れません


約束事( docsを参照 )を優先している場合、4.6.0以上の更新された回答:

mongoose.connect('mongodb://localhost/mydb', { useMongoClient: true })
.then((connection) => {
   connection.db.dropDatabase();
   // alternatively:
   // mongoose.connection.db.dropDatabase();
});

私はmongoose 4.13.6を使ってこのコードを自分のコードでテストしました。 また、 useMongoClientオプション( docsを参照 )の使用に注意してください 。 ドキュメントには、

Mongooseのデフォルトの接続ロジックは4.11.0から推奨されていません。 useMongoClientオプションを使用して新しい接続ロジックを選択してください。ただし、既存のコードベースをアップグレードする場合は、まず接続をテストしてください。


試した@ hellslamと@ silverfighterの答え。 私は競争状態が私のテストを保持しているのを発見した。 私の場合、私はモカテストを実行しています。テストの前の機能では、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





mongoose