복붙노트

[MONGODB] 어떻게 몽구스와 데이터베이스를 제거하려면?

MONGODB

어떻게 몽구스와 데이터베이스를 제거하려면?

나는 Node.js를하고 몽구스에서 데이터베이스 작성 스크립트를 준비하고 있습니다. 어떻게 몽구스를 사용하여 나는 데이터베이스가 이미 존재하는 경우 확인하고, 만약 그렇다면, 드롭 (삭제) 할 수 있습니까?

나는 몽구스와 드롭 할 수있는 방법을 찾을 수 없습니다.

해결법

  1. ==============================

    1.몽구스에서 컬렉션을 놓기위한 방법이 없습니다, 당신이 할 수있는 최선은 하나의 콘텐츠를 제거입니다 :

    몽구스에서 컬렉션을 놓기위한 방법이 없습니다, 당신이 할 수있는 최선은 하나의 콘텐츠를 제거입니다 :

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

    그러나이 사용할 수있는 MongoDB를 기본 자바 스크립트 드라이버에 액세스 할 수있는 방법이있다

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

    아무것도 잘못되는 경우에이를 시도하기 전에 백업을 만듭니다!

  2. ==============================

    2.하나는 이미 연결에 존재하지 않는 경우 몽구스는 당신이 연결을하면 그래서, 당신은 그냥 아무것도가 있는지를 조회 할 수 있습니다, 데이터베이스를 생성합니다.

    하나는 이미 연결에 존재하지 않는 경우 몽구스는 당신이 연결을하면 그래서, 당신은 그냥 아무것도가 있는지를 조회 할 수 있습니다, 데이터베이스를 생성합니다.

    당신은 당신이에 연결된 모든 데이터베이스를 제거 할 수 있습니다 :

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

    3.이 같은 hellslam의 솔루션 @ 수정하는 경우 그것은 작동합니다

    이 같은 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는 적어도 그것은) = 나를 위해 한

  4. ==============================

    4.hellslam의 @와 silverfighter의 답변 @ 시도. 나는 다시 내 테스트를 들고 경쟁 조건을 발견했다. 내 경우에는 내가 모카 테스트를 실행하고있어 시험의 전 기능에 나는 전체 DB를 삭제합니다. 여기에 나를 위해 작동거야.

    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

  5. ==============================

    5.내가 다른 솔루션을 했어 어려움은 그들이 당신이 다시 작동 인덱스를 얻으려면 응용 프로그램을 다시 시작에 의존하고있다.

    내가 다른 솔루션을 했어 어려움은 그들이 당신이 다시 작동 인덱스를 얻으려면 응용 프로그램을 다시 시작에 의존하고있다.

    내 요구 (즉 핵무기 모든 컬렉션은, 그들의 인덱스를 함께 재현 단위 테스트를 실행할 수있는)의 경우,이 솔루션을 구현 결국 :

    당신이 라이브러리에있어하지만 난 개발자를위한 연습기로 떠날 경우가 parellel의 인덱스를 조립하기 위해 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')
        })
      })
    })
    
  6. ==============================

    6.업데이트 된 대답 4.6.0+를 들어, 당신이 약속 (문서 참조)에 대한 선호가있는 경우 :

    업데이트 된 대답 4.6.0+를 들어, 당신이 약속 (문서 참조)에 대한 선호가있는 경우 :

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

    나는 몽구스 4.13.6를 사용하여 내 자신의 코드에이 코드를 테스트했다. 또한, useMongoClient 옵션의 사용을주의 (문서 참조). 문서를 나타냅니다

  7. ==============================

    7.데이터베이스의 특정 모음을 비우려면 :

    데이터베이스의 특정 모음을 비우려면 :

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

    노트 :

  8. ==============================

    8.이 몽구스의 v4.7.0의 나를 위해 작동합니다 :

    이 몽구스의 v4.7.0의 나를 위해 작동합니다 :

    mongoose.connection.dropDatabase();
    
  9. ==============================

    9.몽구스에서 데이터베이스를 제거하는 가장 좋은 방법은 사용중인 몽구스의 버전에 따라 달라집니다. 당신은 4.6.4 이상이, 그 릴리스에 추가이 방법은 가능성이 당신을 위해 잘 작동에가는 것을 몽구스의 버전을 사용하는 경우 :

    몽구스에서 데이터베이스를 제거하는 가장 좋은 방법은 사용중인 몽구스의 버전에 따라 달라집니다. 당신은 4.6.4 이상이, 그 릴리스에 추가이 방법은 가능성이 당신을 위해 잘 작동에가는 것을 몽구스의 버전을 사용하는 경우 :

    mongoose.connection.dropDatabase();
    

    이전 릴리스에서이 방법은 존재하지 않았다. 대신, 직접 MongoDB를 호출을 사용했다 :

    mongoose.connection.db.dropDatabase();
    

    이 데이터베이스 연결이 생성 된 직후에 실행 된 경우, 그것은 가능성이 자동으로 실패 할 수 있습니다. 이것은 실제로 명령이 발생했을 때 아직 설정되지 비동기가 아닌 수의 연결 관계가있다. 이것은 일반적으로 연결이 열린 다음 실행 때까지 큐 .find ()와 같은 다른 몽구스 통화에 대한 문제가되지 않습니다.

    당신이 추가 된 dropDatabase () 바로 가기에 대한 소스 코드를 보면, 당신은이 정확한 문제를 해결하기 위해 설계되었다 볼 수 있습니다. 그것은 연결이 열려 있고 준비가되어 있는지 확인합니다. 그렇다면, 즉시 명령을 발생합니다. 그렇지 않은 경우 데이터베이스 연결을 열 때 실행할 명령을 등록합니다.

    제안 중 일부는 위의 오픈 핸들러에 dropDatabase 명령을 넣어 항상 좋습니다. 연결이 아직 열려 있지 않은 경우 그러나 그것은 단지의 경우에 작동합니다.

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

    여기에 이전 몽구스 버전과 함께 사용할 수있는 위의 논리의 간단한 버전입니다 :

    // 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);
        }
    }  
    
  10. ==============================

    10.4.6.0+를 몽구스 :

    4.6.0+를 몽구스 :

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

    콜백을 전달하면 더 이상 작동하지 않습니다 연결합니다 :

    형식 오류 : 널 (null)의 특성 'commandsTakeWriteConcern'읽을 수 없습니다

  11. ==============================

    11.

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

    12.모음에있는 모든 문서를 삭제의 경우 :

    모음에있는 모든 문서를 삭제의 경우 :

    myMongooseModel.collection.drop();
    

    시험에서 본

  13. from https://stackoverflow.com/questions/10081452/how-to-drop-a-database-with-mongoose by cc-by-sa and MIT license