Відповіді:
Не існує способу видалення колекції з мангуста, найкраще ви можете видалити вміст одного:
Model.remove({}, function(err) {
console.log('collection removed')
});
Але є спосіб отримати доступ до власного драйвера JavaScript 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();
});
mongoose.connection.db.dropDatabase()
але я виявив, що все ще є? Я щось сумую?
dropDatabase
виклик повинен бути розміщений у зворотному дзвінку connect
, як mongoose.connect('...', function() { ...dropDatabase()})
.
mongoose.connection.db.executeDbCommand( {dropDatabase:1}, function(err, result) { if (err) { console.log(err); } done(); });
Якщо ви модифікуєте подібне рішення @ 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 = mongoose.createConnection(cfg.mongo.uri, cfg.mongo.db);
mongoose.connect
насправді повертається mongoose
. Замість того conn = mongoose.connect(...)
, щоб писати mongoose.connect(...)
і тоді conn = mongooose.connection
.
connect
асинхронний. Отже, якщо з'єднання не відбудеться відразу, команда dropDatabase () вийде з ладу. Ось чому в інших вище рішеннях рекомендується додавати dropDatabase
команду до зворотного дзвінка до connect
оператора чи open
обробника подій.
Спробував відповіді @ hellslam та @ silverfighter. Я виявив стан гонки, який стримував мої тести. У моєму випадку я виконую мок-тести, і в функції тесту до того, як я хочу стерти всю БД. Ось що для мене працює.
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/isissue/1469
Оновлена відповідь, для 4.6.0 і новіших версій, якщо ви віддаєте перевагу обіцянкам ( див. Документи ):
mongoose.connect('mongodb://localhost/mydb', { useMongoClient: true })
.then((connection) => {
connection.db.dropDatabase();
// alternatively:
// mongoose.connection.db.dropDatabase();
});
Я перевірив цей код у власному коді, використовуючи мангуст 4.13.6. Також зверніть увагу на використання useMongoClient
опції ( див. Документи ). Документи вказують:
Логіка підключення за замовчуванням Mongoose застаріла з 4.11.0. Будь ласка, увімкніть нову логіку підключення за допомогою параметра useMongoClient, але переконайтесь, що ви перевірили свої з'єднання спочатку, якщо оновлюєте існуючу базу коду!
Складність у мене з іншими рішеннями полягає в тому, що вони покладаються на перезапуск програми, якщо ви хочете, щоб індекси знову працювали.
Для моїх потреб (тобто можливість запустити блок тестування ядер усіх колекцій, а потім відтворити їх разом з їх індексами) я закінчив реалізувати це рішення:
Це покладається на бібліотеки underscore.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')
})
})
})
Щоб очистити певну колекцію в базі даних:
model.remove(function(err, p){
if(err){
throw err;
} else{
console.log('No Of Documents deleted:' + p);
}
});
Примітка:
Це працює для мене від Мангуста v4.7.0
:
mongoose.connection.dropDatabase();
Найкращий спосіб скинути свою базу даних у Мангусту залежить від того, яку версію Mongoose ви використовуєте. Якщо ви користуєтеся версією Mongoose, що має 4.6.4 або новішої версії, то цей метод, доданий у цьому випуску, швидше за все, спрацює нормально:
mongoose.connection.dropDatabase();
У старих випусках цього методу не існувало. Натомість ви повинні використовувати прямий дзвінок MongoDB:
mongoose.connection.db.dropDatabase();
Однак якщо це було запущено відразу після створення з'єднання з базою даних, можливо, воно могло б вийти з ладу. Це пов'язано з тим, що з'єднання насправді має бути асинхронним і ще не встановлюється, коли команда відбувається. Зазвичай це не є проблемою для інших дзвінків 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);
}
}
Мангуст 4.6.0+:
mongoose.connect('mongodb://localhost/mydb')
mongoose.connection.once('connected', () => {
mongoose.connection.db.dropDatabase();
});
Передача зворотного дзвінка для підключення більше не працюватиме:
TypeError: Неможливо прочитати властивість 'commandTakeWriteConcern' з null
connect
повертає обіцянку, тому ви можете додати .then((connection) => { ... });
до mongoose.connect
. Дивіться: mongoosejs.com/docs/connections.html
Оскільки метод видалення амортизується в бібліотеці мангустів, ми можемо використовувати функцію deleteMany без переданих параметрів.
Model.deleteMany();
Це видалить увесь вміст цієї конкретної Моделі, і ваша колекція буде порожньою.