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

Node.js와 Mongoose에서 데이터베이스 생성 스크립트를 준비 중입니다. 데이터베이스가 이미 존재하는지 확인하려면 어떻게해야하나요? 그렇다면 Mongoose를 사용하여 삭제 (삭제)하세요?

몽구스와 함께 떨어 뜨리는 방법을 찾지 못했습니다.



답변

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


답변

@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의 답변을 시도했습니다. 내 테스트를 방해하는 경쟁 조건을 발견했습니다. 제 경우에는 모카 테스트를 실행 중이고 테스트의 이전 기능에서는 전체 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.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')
    })
  })
})


답변

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

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

노트 :

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