【问题标题】:Which is the fastest way to remove MongoDB documents by Date?按日期删除 MongoDB 文档的最快方法是什么?
【发布时间】:2015-07-08 20:24:28
【问题描述】:

在我们公司,我们保留了 8 天的数据(大约有 100 万条记录),因此我们有一个 cronjob 可以每天删除超过 8 天的文档。现在我们正在使用 Published 字段并且此字段未编入索引

删除 100.000 条记录大约需要 15 分钟,我们发现此操作太长。

这是一个查询,其中“docs”是一个变量,其中包含我们不想删除的文档数组。 'theDate' 变量是八天前的日期。

records.remove( { "Published" : { $lte : theDate }, "_id" : { $nin : docs }  }

使用索引的_id字段会更好吗? 我们如何使用 _id 字段来执行相同的操作?

【问题讨论】:

  • 你为什么不索引那个字段?
  • 是的,你可能是对的,我们应该在 Published 字段上创建一个普通索引。我们不这样做的原因是试图使索引的数量和种类保持简单和合理。如果我们可以使用 _id 字段执行此操作,那就更好了。 :) 感谢您的评论。

标签: mongodb mongodb-query


【解决方案1】:

完全放弃 Cron 作业:这是 TTL 索引的作业。 http://docs.mongodb.org/manual/core/index-ttl/

使用expireAfterSeconds: 691200Published 字段上创建一个 TTL 索引,并观察您的文档在发布 8 天后自动删除。

如果您不想在所有文档发布 8 天后不加选择地删除它们,请保留您的 Cron 作业并在 Published 字段上创建一个普通索引。

【讨论】:

  • 我们使用过 TTL 索引,这非常棒。问题是我们需要保留一些文件。所以是的,也许最好的方法是在 Published 字段上创建普通索引。我会稍等片刻,看看我们是否有更多可能的解决方案,但我可能会将这个标记为正确答案。感谢您的评论!
  • @miduga 如果你想保护一些文档不过期,你可以将对应的 TTL 字段设置为一些非日期类型(例如,设置为 null)。 From the documentation:“如果文档中的索引字段不是日期或包含日期值的数组,则文档不会过期。”
猜你喜欢
  • 1970-01-01
  • 2012-12-20
  • 2015-12-07
  • 1970-01-01
  • 2012-02-01
  • 2019-12-06
  • 2016-05-14
  • 1970-01-01
  • 2018-11-28
相关资源
最近更新 更多