2013-05-11 58 views
40

如何在MongoDB中截斷集合或者存在這樣的事情?截斷集合

現在我必須一次性刪除6個大集合,並停止服務器,刪除數據庫文件,然後重新創建數據庫及其中的集合。有沒有辦法刪除數據並保持原樣?刪除操作需要很長時間。我在集合中有數百萬條目。

+0

你是怎麼做刪除操作(當它需要很長時間)? – Stennie 2013-05-11 07:47:42

+7

db.collection.remove({}); – iefpw 2013-05-11 18:14:24

+3

啊!對於大集合,'remove()'命令比'drop()'慢** ** **,因爲它會在刪除文檔時更新索引。如果您要刪除集合中的所有文檔,那麼'drop()'通常是最好的方法。刪除和重新創建相同集合的警告是,您還需要重新確保任何二級索引。 – Stennie 2013-05-11 22:02:08

回答

30

您可以使用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及更早版本中的默認存儲引擎)將 不是釋放preallocated disk space。這對你的用例可能沒問題;當插入新數據時,可用空間可供重用。

如果您要刪除數據庫,則通常不需要顯式創建集合,因爲它們將在插入文檔時創建。

然而,這裏是在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); 
}) 
+1

我忘了注意,如果你刪除和重新創建集合,你還需要添加任何二級索引。您可以使用'db.system.indexes.find()'列出現有的索引定義。 – Stennie 2013-05-11 21:57:57

+0

在分區/分區集合上執行時,這不會造成嚴重破壞嗎? – zamnuts 2015-09-23 20:33:28

+0

@zamnuts感謝評論!在分割的集羣中刪除和重用名稱空間時發現了一個後續問題:[SERVER-17397 - 在分片集羣中刪除數據庫或集合可能不會完全成功](https://jira.mongodb.org/browse/SERVER- 17397)。這是針對MongoDB 2.6+的報告(如果早期版本具有相同的問題,則未經證實)。在這個問題上有一個解決方法,它涉及一些額外的步驟,以確保配置服務器已經更新,並且在命名空間重新創建之前清除了'mongos'緩存。 – Stennie 2015-09-23 20:48:49

2

創建數據庫和集合,然後備份數據庫使用mongodump到BSON文件:

mongodump --db database-to-use 

然後,當你需要刪除該數據庫並重新創建以前的環境,只需使用mongorestore:

mongorestore --drop 

使用命令mongodump時,備份將保存在當前工作目錄中名爲dump的文件夾中。

+0

這將刪除所有包括索引 – astroanu 2015-04-29 05:17:44

50

要截斷收集並保持索引使用

db.<collection>.remove({}) 
+0

這可以工作,但索引大小保持不變。有沒有辦法截斷索引,但仍然保留它們? – logic 2016-11-10 10:13:21

+0

注意,但是,remove()比drop()慢得多。 – rlib 2016-11-30 22:27:25

+0

@rlib是的,它應該是:) – astroanu 2016-12-01 06:09:39

7

的下面的查詢將刪除集合中的所有記錄並將保持原樣收集,

db.collectionname.remove({}) 
1

在MongoDB中沒有與「截斷」操作等價的功能。你可以刪除所有的文件,但它會有O(n)的複雜性,或者刪除集合,那麼複雜度就是O(1),但是你會丟失索引。