Mongoose로 데이터베이스를 삭제하는 방법은 무엇입니까?


답변:


166

mongoose에서 컬렉션을 삭제하는 방법은 없습니다. 최선의 방법은 하나의 콘텐츠를 삭제하는 것입니다.

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

하지만이를 위해 사용할 수있는 mongodb 네이티브 자바 스크립트 드라이버에 액세스하는 방법이 있습니다.

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

경고

문제가 발생할 경우를 대비하여이를 시도하기 전에 백업을 만드십시오!


2
내가 얻을 두 번째 옵션을하려고 할 때 "정의되지 않은 재산 'collectionName 사용'을 읽을 수 없습니다"
Yaron Naveh에게

1
모든 컬렉션은 해시 mongoose.connection.collections에 있으므로 (collection in mongoose.connection.collections) {mongoose.connection.collections [collection] .drop} ... smth similar
drinchev

3
오타가 있습니다. function (err) 뒤에 추가 쉼표가 있어야합니다. mongoose.connection.collections [ 'collectionName']. drop (function (err) {console.log ( 'collection dropped') ;});
arxpoetica 2012-08-19

3
이 대답이 데이터베이스를 삭제하는 방법에 대한 질문을 해결하지 못한다는 것을 깨달은 유일한 사람입니까? 그는이 데이터베이스를 삭제하라는 수집 .. 드롭을 요청하지
조셉 페르시

3
"몽구스에서 컬렉션을 삭제하는 방법은 없습니다", 우선 OP는 데이터 정렬이 아닌 데이터베이스를 삭제하려고합니다. 둘째, 아래 @hellslam의 답변이 잘 작동합니다.
SCBuergel.eth

79

Mongoose는 연결에 데이터베이스가없는 경우 데이터베이스를 생성하므로 일단 연결하면 데이터베이스에 어떤 것이 있는지 쿼리 할 수 ​​있습니다.

연결된 모든 데이터베이스를 삭제할 수 있습니다.

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

1
시도 mongoose.connection.db.dropDatabase()했지만 db가 여전히 있다는 것을 알았습니다. 내가 뭔가를 놓친 건가요?
Freewind

나중에 연결하면 비어 있지만 다시 생성됩니다. 드롭 한 후 컬렉션이 있었나요?
hellslam

전체적으로 동일한 연결을 사용하고 있습니까, 아니면 여러 연결을 생성합니까?
hellslam

12
dropDatabase호출이의 콜백에 배치되어야 함을 발견 connect했습니다 mongoose.connect('...', function() { ...dropDatabase()}).
Freewind

1
dropDatabase가 어떤 경우에는 작동하지 않는 것 같지만 직접 mongoose.connection.db.executeDbCommand( {dropDatabase:1}, function(err, result) { if (err) { console.log(err); } done(); });
mongo

14

@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를 삭제할 수 있습니까? db = mongoose.createConnection(cfg.mongo.uri, cfg.mongo.db);
chovy

2
도움이되었습니다. 감사합니다! 그러나 변수 이름은 약간 오해의 소지가 있습니다 ... mongoose.connect실제로 mongoose. 대신에 conn = mongoose.connect(...)나는 써서 mongoose.connect(...)다음과 conn = mongooose.connection.
유료 괴짜

이 코드 connect는 비동기식 이기 때문에 항상 작동한다고 생각하지 않습니다 . 따라서 연결이 즉시 발생하지 않으면 dropDatabase () 명령이 실패합니다. 이것이 위의 다른 솔루션 dropDatabaseconnect명령문이나 open이벤트 핸들러 의 콜백에 명령을 넣는 것을 권장하는 이유 입니다.
Mark Stosberg

8

@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를 읽을 수 있습니다.


7

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 옵션을 사용하여 새 연결 논리를 선택하십시오. 그러나 기존 코드베이스를 업그레이드하는 경우 먼저 연결을 테스트해야합니다!


5

다른 솔루션에서 내가 가진 어려움은 인덱스를 다시 작동 시키려면 애플리케이션을 다시 시작해야한다는 것입니다.

내 필요에 따라 (즉, 단위 테스트를 실행하여 모든 컬렉션을 핵무기 한 다음 인덱스와 함께 다시 생성 할 수 있음)이 솔루션을 구현했습니다.

이것은 underscore.jsasync.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')
    })
  })
})

4

데이터베이스에서 특정 컬렉션을 비우려면 :

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

노트 :

  1. 특정 스키마 (삭제하고자하는 컬렉션 스키마)를 참조하는 모델을 선택합니다.
  2. 이 작업은 데이터베이스에서 컬렉션 이름을 삭제하지 않습니다.
  3. 컬렉션의 모든 문서가 삭제됩니다.

4

이것은 Mongoose부터 저에게 효과적입니다 v4.7.0.

mongoose.connection.dropDatabase();

4

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);
    }
}  

2

몽구스 4.6.0 이상 :

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

연결을위한 콜백 전달은 더 이상 작동하지 않습니다.

TypeError : null의 'commandsTakeWriteConcern'속성을 읽을 수 없습니다.


1
connect당신이 추가 할 수 있도록, 약속을 반환 .then((connection) => { ... });받는 mongoose.connect. 참조 : mongoosejs.com/docs/connections.html
Andre M

1
beforeEach((done) => {
      mongoose.connection.dropCollection('products',(error ,result) => {
      if (error) {
        console.log('Products Collection is not dropped')
      } else {
        console.log(result)
      }
    done()
    })
  })

0

mongoose 라이브러리에서 remove 메소드가 감가 상각되므로 매개 변수가 전달되지 않은 상태에서 deleteMany 함수를 사용할 수 있습니다.

Model.deleteMany();

이 특정 모델의 모든 콘텐츠가 삭제되고 컬렉션이 비어 있습니다.


0

컬렉션의 모든 문서를 삭제하려면 :

await mongoose.connection.db.dropDatabase();

이 답변은 mongoose index.d.ts 파일을 기반으로합니다.

dropDatabase(): Promise<any>;

-2

컬렉션의 모든 문서를 삭제하려면 :

myMongooseModel.collection.drop();

테스트 에서 볼 수 있듯이

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.