我如何在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();
    }
})

值得注意的是,根据配置的存储引擎,删除一个集合会对存储使用产生不同的结果:

  • WiredTiger(MongoDB 3.2或更新版本中的默认存储引擎)将在删除完成后释放删除的集合(以及任何相关索引)所使用的空间.
  • MMAPv1(MongoDB 3.0及更早版本中的默认存储引擎)将

如果要删除数据库,通常不需要显式创建集合,因为它们将在插入文档时创建.

但是,下面是在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);
})

Mongodb相关问答推荐

使用单个/多个值查询任何/特定,而不使用if块

MongoDB:如何通过增量向量递增整数向量

try 从数据库创建、获取数据时失败(pymongo、MongoDB、docker-compose)

MongoDB $lookup 查找字段值数组

MongoDB 聚合 $match 阶段与条件查询

避免在 MongoDB 聚合框架中使用 ISODate() 以便管道可以是纯 JSON

分页时根据唯一字段mongodb获取数据

在运算符 $map 中嵌入运算符 $exists

从嵌套数组中 id 匹配的另一个集合中获取所有字段

Pymongo API TypeError: Unhashable dict

从 node.js 的 mongodb 集合中删除文档

Raft Vs MongoDB 初选

Meteor 如何接收对 MongoDB 查询结果的更新?

Node.js 数据库的抽象层

用 BsonRepresentation(BsonType.ObjectId) vs BsonId vs ObjectId 在 C# 中装饰属性之间的区别

如何使用 mongodb 和 php 正确处理分页查询?

如何在mongoose中加入两个集合

Java + MongoDB:更新文档中的多个字段

如何在 MongoDB 中删除此弃用警告,为什么会这样?

我如何将 mongodb 与electron一起使用?