Node.jsとMongooseでデータベース作成スクリプトを準備中です。データベースが既に存在するかどうかを確認するにはどうすればよいですか?存在する場合は、Mongoose を使用してドロップ (削除) しますか?
Mongoose でドロップする方法が見つかりませんでした。
コレクションをマングースから削除する方法はありません。できる最善の方法は、コレクションのコンテンツを削除することです。
Model.remove({}, function(err) {
console.log('collection removed')
});
しかし、これに使用できるmongodbネイティブjavascriptドライバーにアクセスする方法があります
mongoose.connection.collections['collectionName'].drop( function(err) {
console.log('collection dropped');
});
何か問題が発生した場合に備えて、これを試す前にバックアップを作成してください。
Mongooseは、接続時にデータベースがまだ存在しない場合にデータベースを作成するため、接続を確立したら、データベースにクエリを実行して、データベースに何かがあるかどうかを確認できます。
接続している任意のデータベースを削除できます。
var mongoose = require('mongoose');
/* Connect to the DB */
mongoose.connect('mongodb://localhost/mydatabase',function(){
/* Drop the DB */
mongoose.connection.db.dropDatabase();
});
このように@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 少なくとも私には効果があったので、共有することにしました =)
@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
これは、Mongooseの時点で機能しますv4.7.0
:
mongoose.connection.dropDatabase();
他のソリューションで私が抱えていた問題は、インデックスを再び機能させたい場合、アプリケーションの再起動に依存していることです。
私のニーズ(つまり、すべてのコレクションを核攻撃し、それらをインデックスとともに再作成するユニットテストを実行できるようにすること)のために、私はこのソリューションを実装することになりました:
これは、インデックスを並列にアセンブルするために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')
})
})
})
データベース内の特定のコレクションを空にするには:
model.remove(function(err, p){
if(err){
throw err;
} else{
console.log('No Of Documents deleted:' + p);
}
});
ノート:
コレクション内のすべてのドキュメントを削除するには:
await mongoose.connection.db.dropDatabase();
この回答は、mongoose index.d.ts ファイルに基づいています。
dropDatabase(): Promise<any>;