MongoDB:安全地批量删除数百万个旧文档

时间:2019-08-22 22:37:02

标签: mongodb mongodb-query

我想知道您对以下情况的看法:

提供以下mongo db集合:

收藏大小:192.87GB

总文件数:165.578.552

我想从现在开始删除早于一年的文档。我估计它将占馆藏的一半左右,约有8000万份文档。

所以基本上我有两个问题:

在删除文档之前运行count()查询以确保完全匹配是否安全?

...->count({timestamp: {$lt: '1534976762'}})

注意:timestamp未建立索引,我还有另一个字段time已建立索引,但是我无法使查询在time.sec上起作用

enter image description here

第二,我可以安全地批量删除多少个文档?我来自MySQL世界,而不是Mongo专家,所以,也许我要采取很多预防措施。这是一个生产数据库。

谢谢!

2 个答案:

答案 0 :(得分:1)

> length(unique(motifs)) [1] 1 要保留的文档将它们复制到新的收藏夹,然后删除旧的收藏夹,可能会更快。

要准确计数集合中的文档,您需要使用CountDocuments,因为较旧的find命令不能在所有情况下都提供准确的计数。正如先前的作者提到的count在未索引字段上将执行集合扫描,这将影响数据库性能。收集完数据后,可以对同一查询使用deleteMany来删除这些文档。

要确保所计数的文档和已删除的文档集不被更改,可以在transaction内运行countDocumentscountDocuments

答案 1 :(得分:0)

我建议您关闭辅助节点并对其进行计数,获取编号,进行分析,然后执行删除。请记住,删除文档不会将空间释放回OS。相反,mongodb将考虑未来的增长来保留空间

如果您打算对馆藏进行整理,最好将所需文档复制到新馆藏中,并删除现有的文件