我如何在MongoDB中截断一个集合,或者有这样的东西吗?
现在我必须一次删除6个大型集合,我要停止服务器,删除数据库文件,然后重新创建数据库和其中的集合.有没有办法删除数据并保持集合不变?删除操作需要很长时间.我Collection 了数以百万计的作品.
我如何在MongoDB中截断一个集合,或者有这样的东西吗?
现在我必须一次删除6个大型集合,我要停止服务器,删除数据库文件,然后重新创建数据库和其中的集合.有没有办法删除数据并保持集合不变?删除操作需要很长时间.我Collection 了数以百万计的作品.
您可以高效地删除一个集合的所有数据和索引(db.collection.drop()
).删除包含大量文档和/或索引的集合比使用db.collection.remove({})
删除所有文档要高效得多.remove()
方法在文档被删除时进行额外的索引更新管理,在副本集环境中,oplog将 for each 被删除的文档包含条目,而不是一个单独的collection drop命令,这将更加缓慢.
使用mongo
shell的示例:
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();
}
})
值得注意的是,根据配置的存储引擎,删除一个集合会对存储使用产生不同的结果:
如果要删除数据库,通常不需要显式创建集合,因为它们将在插入文档时创建.
但是,下面是在mongo
shell中删除并重新创建具有相同集合名称的数据库的示例:
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);
})