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

MongoDB:安全地批量删除数百万个旧文档,mongodb,mongodb-query,Mongodb,Mongodb Query,我想知道你对以下情况的看法: 提供以下mongo db集合: 集合大小:192.87GB 文件总数:165.578.552 我想从现在起删除一年以上的文档。据我估计,这将是大约一半的收集,约8000万份文件 基本上我有两个问题: 在删除文档之前运行count()查询以获得精确匹配是否安全 …>计数({timestamp:{$lt:'1534976762'}}) 注意:timestamp未编制索引,我有另一个字段time,该字段已编制索引,但我无法使用time.sec 第二,我可以安全地批量删除

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

提供以下mongo db集合:

集合大小:192.87GB

文件总数:165.578.552

我想从现在起删除一年以上的文档。据我估计,这将是大约一半的收集,约8000万份文件

基本上我有两个问题:

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

…>计数({timestamp:{$lt:'1534976762'}})

注意:
timestamp
未编制索引,我有另一个字段
time
,该字段已编制索引,但我无法使用
time.sec

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


谢谢

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

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


为确保清点的文档和已删除的文档集不会发生更改,您可以在内部运行
countDocuments
delete\u many

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


如果您计划对集合执行内务管理,最好将所需文档复制到新集合中,并将现有文档删除到非索引字段中的可能重复的,这样做不安全,
计数(…)
,因为它将执行集合扫描。执行
db.collection.explain().count(…)
并检查它是否包含
COLLSCAN
。如果它这样做了(它应该这样做),那么它就不安全了。另外,
db.collection.getIndexes()
对该集合的输出是什么?如何为
时间
字段编制索引?