【问题标题】:MongoDB: Safely bulk delete millions of old DocumentsMongoDB:安全地批量删除数百万个旧文档
【发布时间】:2019-08-26 14:24:00
【问题描述】:

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

提供以下 mongo db 集合:

收藏大小:192.87GB

文件总数:165.578.552

我想删除一年后的文档。我估计它将是集合的一半左右,大约 8000 万份文档。

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

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

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

注意:timestamp 未编入索引,我还有另一个字段 time,已编入索引,但我无法使用 time.sec 进行查询

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

谢谢!

【问题讨论】:

  • MongoDB very slow deletes的可能重复
  • 在非索引字段上,count(...) 是不安全的,因为它会进行集合扫描。执行db.collection.explain().count(...) 并检查它是否包含COLLSCAN。如果是(应该),那就不安全了。
  • 此外,db.collection.getIndexes() 在该集合上的输出是什么?你如何索引time 字段?

标签: mongodb mongodb-query


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    要准确计算集合中的文档数,您需要使用 CountDocuments,因为旧的 countcommand 无法在所有情况下都给出准确的计数。正如前面的作者提到的countDocuments,未索引的字段将进行集合扫描,这将影响数据库性能。一旦你有了你的集合,你就可以使用deleteMany 和相同的查询来删除这些文档。

    为确保计数的文档和已删除的文档集不会更改,您可以在 transaction 中运行 countDocumentsdelete_many

    【讨论】:

      猜你喜欢
      • 2020-06-15
      • 1970-01-01
      • 1970-01-01
      • 2015-06-02
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 2019-05-18
      • 2019-05-23
      相关资源
      最近更新 更多