your programing

몽구스로 데이터베이스를 삭제하는 방법?

lovepro 2023. 4. 2. 12:13
반응형

몽구스로 데이터베이스를 삭제하는 방법?

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

적어도 나한테는 그랬기 때문에 공유하기로 했어=)

@hellslam과 @silverfighter의 답변을 시험해 보았다.나는 내 테스트를 지연시키는 인종적 조건을 발견했다.저 같은 경우에는 mocha test를 실행하고 있는데, 테스트의 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 를 참조해 주세요.

약속에 대한 선호가 있는 경우 4.6.0+에 대한 최신 답변(문서 참조):

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

4.코드로 mongoose 4.13.6의 해 주세요.또한 이 코드에는useMongoClient옵션(문서 참조).문서는 다음을 나타냅니다.

Mongoose의 기본 연결 로직은 4.11.0으로 사용되지 않습니다. useMongoClient 옵션을 사용하여 새 연결 로직을 선택하되, 기존 코드 베이스를 업그레이드하려면 연결을 먼저 테스트하십시오!

다른 솔루션에서는 인덱스를 다시 작동시키려면 응용 프로그램을 재시작해야 한다는 문제가 있었습니다.

필요에 따라(즉, 모든 컬렉션을 유닛 테스트한 후 인덱스와 함께 다시 작성할 수 있음) 이 솔루션을 구현하게 되었습니다.

이것은 언더스코어.js와 async.js 라이브러리에 의존하여 인덱스를 parellel로 조립합니다.라이브러리에 반대하시면 언로드가 해제될 수 있습니다만, 개발자를 위한 액티비저로서 남겨둡니다.

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

은 몽구스에서는 .v4.7.0:

mongoose.connection.dropDatabase();

2020년 갱신

드롭이라고 하는 새로운 파일을 만듭니다.즉, 파일을 안에 넣습니다.

require('dotenv').config()
const url = process.env.ATLAS_URI;
mongoose.connect(url, {
  useNewUrlParser: true,
  useCreateIndex: true,
  useUnifiedTopology: true,
  useFindAndModify: false
});

const connection = mongoose.connection;
connection.once('open', () => {
  console.log("MongoDB database connection established successfully");
})


mongoose.connection.dropDatabase().then(
  async() => {
   
    try {
      mongoose.connection.close()
     
    }
    catch (err) {
      console.log(err)
    }

 }
  
);

당신의 패키지에.json

in your package.json 
 "scripts": {
    
    "drop": "node models/drop.js",
   
  }

콘솔에서 실행하고

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

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

주의:

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

Mongoose에서 데이터베이스를 삭제하는 가장 좋은 방법은 사용 중인 Mongoose 버전에 따라 달라집니다.Mongoose 버전 4.6.4 이후를 사용하고 있는 경우는, 그 릴리스에 추가되어 있는 이 방법이 유효하게 동작합니다.

mongoose.connection.dropDatabase();

이전 릴리스에서는 이 방법이 없었습니다.대신 직접 MongoDB 콜을 사용합니다.

mongoose.connection.db.dropDatabase();

그러나 데이터베이스 연결이 생성된 직후에 이 작업이 실행된 경우 자동으로 실패할 수 있습니다.이는 연결이 실제로 비동기이며 명령어가 실행될 때 아직 설정되지 않은 것과 관련이 있습니다.가 되지 . 예를 들어, Mongoose는 Mongoose를 호출합니다..find()접속이 열릴 때까지 큐잉한 후 실행됩니다.

「 」의,dropDatabase()이 문제를 해결하기 위해 설계된 숏컷을 볼 수 있습니다.접속이 열려 있고 준비가 되어 있는지 확인합니다.이 경우 명령어가 즉시 실행됩니다.그렇지 않으면 데이터베이스 연결이 열렸을 때 실행할 명령을 등록합니다.

위의 제안 중 몇 가지는 항상 다음을 포함하도록 권장합니다.dropDatabaseopen 그것은 이 열리지 않은 합니다.하지만 그것은 아직 연결이 되지 않은 경우에만 효과가 있습니다.

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

Mongoose 4.6.0+:

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

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

TypeError: 속성 ' 명령을 읽을 수 없습니다.TakeWriteConcern'은 null입니다.

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

집합의 모든 문서를 삭제하려면:

await mongoose.connection.db.dropDatabase();

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

dropDatabase(): Promise<any>;
mongoose.connect(`mongodb://localhost/${dbname}`, {
        useNewUrlParser: true,
        useCreateIndex: true,
        useFindAndModify: true,
        useUnifiedTopology: true
    })
        .then((connection) => {
            mongoose.connection.db.dropDatabase();
        });

전체 데이터베이스를 삭제하려면 이름만 전달하면 됩니다.이것은 버전 4.4에서 완벽하게 동작하고 있습니다.

제거 방법은 mongoose 라이브러리에서 감가상각되므로 매개 변수를 전달하지 않고 delete Many 함수를 사용할 수 있습니다.

Model.deleteMany();

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

컬렉션의 모든 문서를 삭제하는 경우:

myMongooseModel.collection.drop();

테스트에서 알 수 있듯이

언급URL : https://stackoverflow.com/questions/10081452/how-to-drop-a-database-with-mongoose

반응형