截断一个集合

时间:2013-05-11 04:58:09

标签: mongodb mongodb-.net-driver

如何在MongoDB中截断集合或者是否有这样的东西?

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

7 个答案:

答案 0 :(得分:57)

截断集合并使用

保持索引
 db.<collection>.remove({})

答案 1 :(得分:35)

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

使用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及更早版本中的默认存储引擎)将会 释放preallocated disk space。这对您的用例可能没问题;插入新数据时,可以重用可用空间。

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

但是,这是一个在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);
})

答案 2 :(得分:8)

以下查询将删除集合中的所有记录,并按原样保留集合,

db.collectionname.remove({})

答案 3 :(得分:2)

创建数据库和集合,然后使用mongodump:

将数据库备份到bson文件
mongodump --db database-to-use

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

mongorestore --drop

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

答案 4 :(得分:2)

MongoDB中没有“truncate”操作。您可以删除所有文档,但它的复杂性为O(n),或者删除集合,然后复杂性为O(1),但您将丢失索引。

答案 5 :(得分:0)

db.drop()方法在受影响的数据库上获得了写锁定,并将阻止其他操作,直到完成为止。

我认为使用db.remove({})方法比db.drop()更好。

答案 6 :(得分:0)

(仅提供信息)

如果您需要在Laravel中进行操作,我们可以使用此

ModelName::truncate();

此外,我们可以使用 Mongo Compass(mongo的GUI),我们可以很容易地理解这些操作