Ответ 1
Вы можете эффективно отбросить все данные и индексы для коллекции с помощью db.collection.drop()
. Удаление коллекции с большим количеством документов и/или индексов будет значительно более эффективным, чем удаление всех документов с использованием db.collection.remove({})
. Метод remove()
выполняет дополнительные операции по обновлению индексов при удалении документов и будет даже медленнее в среде с набором реплик, где в журнал операций будут входить записи для каждого удаленного документа, а не одна команда удаления коллекции.
Пример использования оболочки mongo
:
var dbName = 'nukeme';
db.getSiblingDB(dbName).getCollectionNames().forEach(function(collName) {
// Drop all collections except system ones (indexes/profile)
if (!collName.startsWith("system.")) {
// Safety hat
print("WARNING: going to drop ["+dbName+"."+collName+"] in 5s .. hit Ctrl-C if you've changed your mind!");
sleep(5000);
db[collName].drop();
}
})
Стоит отметить, что удаление коллекции имеет разные результаты при использовании хранилища в зависимости от настроенного механизма хранения:
- WiredTiger (механизм хранения по умолчанию в MongoDB 3.2 или новее) освободит пространство, используемое отброшенной коллекцией (и всеми связанными с ней индексами) после завершения удаления.
- MMAPv1 (механизм хранения по умолчанию в MongoDB 3.0 и более ранних версиях) не освобождает предварительно выделенное дисковое пространство. Это может быть хорошо для вашего случая использования; свободное место доступно для повторного использования при вставке новых данных.
Если вместо этого вы удаляете базу данных, вам обычно не нужно явно создавать коллекции, поскольку они будут создаваться при вставке документов.
Тем не менее, вот пример удаления и воссоздания базы данных с одинаковыми именами коллекций в оболочке mongo
:
var dbName = 'nukeme';
// Save the old collection names before dropping the DB
var oldNames = db.getSiblingDB(dbName).getCollectionNames();
// Safety hat
print("WARNING: going to drop ["+dbName+"] in 5s .. hit Ctrl-C if you've changed your mind!")
sleep(5000)
db.getSiblingDB(dbName).dropDatabase();
// Recreate database with the same collection names
oldNames.forEach(function(collName) {
db.getSiblingDB(dbName).createCollection(collName);
})