몽구스로 데이터베이스를 삭제하는 방법?
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);
}
});
주의:
- 특정 스키마(삭제할 컬렉션의 스키마)를 참조하는 모델을 선택합니다.
- 이 작업은 수집 이름을 데이터베이스에서 삭제하지 않습니다.
- 이렇게 하면 컬렉션의 모든 문서가 삭제됩니다.
Mongoose에서 데이터베이스를 삭제하는 가장 좋은 방법은 사용 중인 Mongoose 버전에 따라 달라집니다.Mongoose 버전 4.6.4 이후를 사용하고 있는 경우는, 그 릴리스에 추가되어 있는 이 방법이 유효하게 동작합니다.
mongoose.connection.dropDatabase();
이전 릴리스에서는 이 방법이 없었습니다.대신 직접 MongoDB 콜을 사용합니다.
mongoose.connection.db.dropDatabase();
그러나 데이터베이스 연결이 생성된 직후에 이 작업이 실행된 경우 자동으로 실패할 수 있습니다.이는 연결이 실제로 비동기이며 명령어가 실행될 때 아직 설정되지 않은 것과 관련이 있습니다.가 되지 . 예를 들어, Mongoose는 Mongoose를 호출합니다..find()
접속이 열릴 때까지 큐잉한 후 실행됩니다.
「 」의,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);
}
}
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
'your programing' 카테고리의 다른 글
React 하위 구성 요소의 소품으로 상태를 업데이트하는 중 (0) | 2023.04.02 |
---|---|
jQuery를 사용하여 실패 시 AJAX 요청을 재시도하는 가장 좋은 방법은 무엇입니까? (0) | 2023.04.02 |
스프링 부트 JMX에 원격으로 액세스하는 방법 (0) | 2023.04.02 |
유효한 JSON을 얻기 위한 정규식 이스케이프 (0) | 2023.03.13 |
CMS를 직접 작성해야 합니까? (0) | 2023.03.13 |