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

mau*_*int 5 mongodb mongodb-query

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

给出以下 mongo 数据库集合:

集合大小:192.87GB

文件总数:165.578.552

我想删除一年以上的文档。我估计这将是馆藏的一半左右,大约 8000 万份文档。

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

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

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

注意:timestamp没有索引,我有另一个字段time,它已索引,但我还无法使查询工作time.sec

在此输入图像描述

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

谢谢!

小智 5

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

如果您计划对集合进行整理,最好将所需文档复制到新集合并删除现有文档


Joe*_*ole 2

find将您想要保留的文档复制到新集合,然后删除旧集合可能会更快。

要准确计算集合中的文档数量,您需要使用CountDocuments,因为旧count命令无法在所有情况下提供准确的计数。正如前作者提到的,countDocuments未索引的字段将进行集合扫描,这将影响数据库性能。获得集合后,您可以使用带有相同查询的deleteMany来删除这些文档。

为了确保计数的文档和删除的文档集不会更改,您可以在事务countDocuments中运行和。delete_many