답변:
mongoose에서 컬렉션을 삭제하는 방법은 없습니다. 최선의 방법은 하나의 콘텐츠를 삭제하는 것입니다.
Model.remove({}, function(err) {
console.log('collection removed')
});
하지만이를 위해 사용할 수있는 mongodb 네이티브 자바 스크립트 드라이버에 액세스하는 방법이 있습니다.
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();
});
mongoose.connection.db.dropDatabase()
했지만 db가 여전히 있다는 것을 알았습니다. 내가 뭔가를 놓친 건가요?
dropDatabase
호출이의 콜백에 배치되어야 함을 발견 connect
했습니다 mongoose.connect('...', function() { ...dropDatabase()})
.
mongoose.connection.db.executeDbCommand( {dropDatabase:1}, function(err, result) { if (err) { console.log(err); } done(); });
@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는 적어도 나를 위해 했으므로 공유하기로 결정했습니다 =)
db = mongoose.createConnection(cfg.mongo.uri, cfg.mongo.db);
mongoose.connect
실제로 mongoose
. 대신에 conn = mongoose.connect(...)
나는 써서 mongoose.connect(...)
다음과 conn = mongooose.connection
.
connect
는 비동기식 이기 때문에 항상 작동한다고 생각하지 않습니다 . 따라서 연결이 즉시 발생하지 않으면 dropDatabase () 명령이 실패합니다. 이것이 위의 다른 솔루션 dropDatabase
이 connect
명령문이나 open
이벤트 핸들러 의 콜백에 명령을 넣는 것을 권장하는 이유 입니다.
@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를 읽을 수 있습니다.
4.6.0+에 대한 업데이트 된 답변, promise를 선호하는 경우 ( docs 참조 ) :
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 옵션을 사용하여 새 연결 논리를 선택하십시오. 그러나 기존 코드베이스를 업그레이드하는 경우 먼저 연결을 테스트해야합니다!
다른 솔루션에서 내가 가진 어려움은 인덱스를 다시 작동 시키려면 애플리케이션을 다시 시작해야한다는 것입니다.
내 필요에 따라 (즉, 단위 테스트를 실행하여 모든 컬렉션을 핵무기 한 다음 인덱스와 함께 다시 생성 할 수 있음)이 솔루션을 구현했습니다.
이것은 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')
})
})
})
이것은 Mongoose부터 저에게 효과적입니다 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://stackoverflow.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'속성을 읽을 수 없습니다.
connect
당신이 추가 할 수 있도록, 약속을 반환 .then((connection) => { ... });
받는 mongoose.connect
. 참조 : mongoosejs.com/docs/connections.html
mongoose 라이브러리에서 remove 메소드가 감가 상각되므로 매개 변수가 전달되지 않은 상태에서 deleteMany 함수를 사용할 수 있습니다.
Model.deleteMany();
이 특정 모델의 모든 콘텐츠가 삭제되고 컬렉션이 비어 있습니다.