80

我如何截断 MongoDB 中的集合或者有这样的事情?

现在我必须一次删除 6 个大型集合,我正在停止服务器,删除数据库文件,然后重新创建数据库和其中的集合。有没有办法删除数据并使集合保持原样?删除操作需要很长时间。我的收藏中有数百万个条目。

4

7 回答 7

86

To truncate a collection and keep the indexes use

 db.<collection>.remove({})
于 2014-04-23T08:12:12.717 回答
56

您可以使用db.collection.drop(). 删除包含大量文档和/或索引的集合将比使用db.collection.remove({}). 该remove()方法会在删除文档时执行更新索引的额外内务管理,并且在 oplog 将包含每个已删除文档的条目而不是单个集合删除命令的副本集环境中甚至会更慢。

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但是,下面是在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);
})
于 2013-05-11T07:47:29.607 回答
19

下面的查询将删除集合中的所有记录并保持集合不变,

db.collectionname.remove({})
于 2014-07-22T09:12:22.890 回答
5

MongoDB 中没有与“截断”操作等效的操作。您可以删除所有文档,但复杂度为 O(n),或者删除集合,复杂度为 O(1),但您会丢失索引。

于 2017-01-12T10:02:11.577 回答
4

创建数据库和集合,然后使用 mongodump 将数据库备份到 bson 文件:

mongodump --db database-to-use

然后,当您需要删除数据库并重新创建以前的环境时,只需使用 mongorestore:

mongorestore --drop

当您使用命令 mongodump 时,备份将保存在当前工作目录中名为 dump 的文件夹中。

于 2013-05-11T05:23:49.247 回答
0

The db.drop() method obtains a write lock on the affected database and will block other operations until it has completed.

I think using the db.remove({}) method is better than db.drop().

于 2018-12-07T09:11:50.730 回答
0

remove()在 MongoDB 4 中已弃用。

您需要使用deleteMany或其他功能:

db.<collection>.deleteMany({})
于 2021-11-19T05:03:18.047 回答