如何在MongoDB中截斷集合或者存在這樣的事情?截斷集合
現在我必須一次性刪除6個大集合,並停止服務器,刪除數據庫文件,然後重新創建數據庫及其中的集合。有沒有辦法刪除數據並保持原樣?刪除操作需要很長時間。我在集合中有數百萬條目。
如何在MongoDB中截斷集合或者存在這樣的事情?截斷集合
現在我必須一次性刪除6個大集合,並停止服務器,刪除數據庫文件,然後重新創建數據庫及其中的集合。有沒有辦法刪除數據並保持原樣?刪除操作需要很長時間。我在集合中有數百萬條目。
您可以使用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();
}
})
值得一提的是,丟棄集合具有存儲使用情況取決於配置的存儲引擎不同的結果:
如果您要刪除數據庫,則通常不需要顯式創建集合,因爲它們將在插入文檔時創建。
然而,這裏是在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);
})
我忘了注意,如果你刪除和重新創建集合,你還需要添加任何二級索引。您可以使用'db.system.indexes.find()'列出現有的索引定義。 – Stennie 2013-05-11 21:57:57
在分區/分區集合上執行時,這不會造成嚴重破壞嗎? – zamnuts 2015-09-23 20:33:28
@zamnuts感謝評論!在分割的集羣中刪除和重用名稱空間時發現了一個後續問題:[SERVER-17397 - 在分片集羣中刪除數據庫或集合可能不會完全成功](https://jira.mongodb.org/browse/SERVER- 17397)。這是針對MongoDB 2.6+的報告(如果早期版本具有相同的問題,則未經證實)。在這個問題上有一個解決方法,它涉及一些額外的步驟,以確保配置服務器已經更新,並且在命名空間重新創建之前清除了'mongos'緩存。 – Stennie 2015-09-23 20:48:49
創建數據庫和集合,然後備份數據庫使用mongodump到BSON文件:
mongodump --db database-to-use
然後,當你需要刪除該數據庫並重新創建以前的環境,只需使用mongorestore:
mongorestore --drop
使用命令mongodump時,備份將保存在當前工作目錄中名爲dump的文件夾中。
這將刪除所有包括索引 – astroanu 2015-04-29 05:17:44
的下面的查詢將刪除集合中的所有記錄並將保持原樣收集,
db.collectionname.remove({})
在MongoDB中沒有與「截斷」操作等價的功能。你可以刪除所有的文件,但它會有O(n)的複雜性,或者刪除集合,那麼複雜度就是O(1),但是你會丟失索引。
你是怎麼做刪除操作(當它需要很長時間)? – Stennie 2013-05-11 07:47:42
db.collection.remove({}); – iefpw 2013-05-11 18:14:24
啊!對於大集合,'remove()'命令比'drop()'慢** ** **,因爲它會在刪除文檔時更新索引。如果您要刪除集合中的所有文檔,那麼'drop()'通常是最好的方法。刪除和重新創建相同集合的警告是,您還需要重新確保任何二級索引。 – Stennie 2013-05-11 22:02:08