我的MongoDB數據庫中有一個集合,它在一段時間之前爲它啓用了Mongoid :: Versioning。不幸的是,它使我的一些文件的大小非常大。我看到有些超過711K。這會導致昂貴的磁盤I/O和昂貴的讀取/寫入時間。我正在尋找解決方案來通過這個集合(其中有近200萬個文檔),如果可能的話,安全地刪除所有的mongoid版本。據我所知,Mongoid只是將版本存儲在一個名爲versions
的數組屬性中。如果有GANK它從我的所有文件的方式,不會完全使數據庫不可用(在性能方面,而我要做整個磁盤掃描+寫入/更新)的方式,那將是巨大的。MongoDB/Mongoid,刪除文檔版本
1
A
回答
1
有很多的方式來處理這種情況。我已經嘗試了幾種不同的方法,對於一萬個記錄的試用,他們有相似的處理時間。我嘗試了另一種,發現情況更糟。如果有幫助,我會在這裏附上。
在這裏,我正在研究這個過程的批處理將有助於緩解對數據庫的影響的假設。
第一種方法是在集合上進行查找,並限制處理批次。
var batchsize = 50
var c = db.collection.count()
for(x=0;x<Math.floor(c/batchsize);x++){
db.collection.find({versions: {$exists:true}}).limit(batchsize).forEach(function(cur){
db.collection.update({_id:cur._id},{$unset:{versions:""}})
})
}
這裏的問題將是每個新批次都需要的收集掃描。限制將有助於影響,但收集仍然很昂貴。
的第二種方法將填充的陣列與_id
一切都具有一個versions
陣列的文件,然後通過陣列和更新迭代:
var arr = db.collection.find({versions:{$exists:true}},{_id:1}).toArray()
while(arr.length>0){
for(x=0;x<batchsize;x++){
var curId = arr.pop();
db.collection.update(curId,{$unset:{versions:""}})
}
}
這將意味着一個初始完整集合掃描,但在此之後,它將全部遍歷數組並進行批量更新。
我試過了第三種方法,在那裏我通過集合找到比前一個更大的_id
並更新,但發現這樣會更加昂貴(即使它能夠使用_id
上的索引) 。我在這裏添加它,以防它有用。
var curid = db.collection.find({_id:{$gt:MinKey}},{_id:1}).sort({_id:1}).limit(1).next()._id;
while(curid < MaxKey){
db.collection.update({_id:curid},{$unset:{versions:""}});
curid = db.collection.find({_id:{$gt:curid}},{_id:1}).sort({_id:1}).limit(1).next()._id;
}
相關問題
- 1. 如何刪除特定空間/文檔的版本
- 2. Sharepoint事件接收器和文檔庫和版本被刪除
- 3. 在Alfresco中刪除文檔的特定版本
- 4. 從Word Interop文檔中刪除文本
- 5. 刪除MS word文檔的文本框
- 6. 刪除舊版本
- 7. 從文件中刪除文件版本
- 8. 刪除舊文件版本安裝
- 9. 從xml文件中刪除版本
- 10. 如何刪除明文中的版本
- 11. 從文檔中刪除子文檔
- 12. 刪除文件夾內容並從版本控制中刪除
- 13. Git:從版本中刪除文件,但不刪除它
- 14. 刪除SVN歷史版本
- 15. Sitecore.Resources.Media.MediaCreator刪除媒體版本
- 16. Git,刪除版本庫
- 17. Capistrano不刪除舊版本
- 18. Jenkins:刪除舊版本
- 19. SoaSuiteComposites刪除舊版本
- 20. cvs刪除所有版本
- 21. 刪除版本號爲
- 22. Eclipse Subversive:刪除版本庫
- 23. 無法刪除版本
- 24. Wildfly Deploy Maven - 刪除版本
- 25. JDBC插入文檔版本
- 26. 文檔版本管理
- 27. 版本比較JSON文檔
- 28. Mule文檔pdf版本
- 29. 文檔版本控制
- 30. Python + MongoDB文檔版本