【问题标题】:Removing obsolete data with MongoDB使用 MongoDB 删除过时的数据
【发布时间】:2019-11-09 14:27:44
【问题描述】:

我有通过 MQTT 将压力数据读入 MongoDB 的 IoT 设备。

问题是,随着时间的推移绘制这些数据需要大量资源,而且还浪费存储空间。因此,我想使保存的数据逐渐被删除。我想将 1/1 保留一个小时,1/4 保留一天,1/4 再保留一周,然后永远保留 1/4。我最初的想法是在发布数据时使用某种模数,设置正确的时间限制。

我试过查看 MongoDB TTL 函数,但在我看来,它为整个集合设置了一个计时器,我唯一的选择是哪些特定文档会受到它的影响。

我有 Java 中间件为我将数据发布到 MongoDB,让 Java 程序来做这些事情会更好吗?我仍然不确定如何删除每个 n 条目。

【问题讨论】:

  • 您可能应该删除aggregation-framework 标签,因为它不属于该主题,它可能会错误地影响搜索。
  • @Plancke 我认为聚合框架可能是创建属于一起的文档 ID 桶的好方法,随着时间的推移,越来越多的 ID 会被丢弃
  • @DanielF 很公平,我想他们可以使用 $sample 阶段从特定时间范围内选择随机文档。
  • @Plancke 好吧,我忘了在我的问题中提到它,但我确实考虑过使用 $match 来查找东西。然后我在那个函数中使用对象时遇到了麻烦,比如 new Date(Date.now()),我有点放弃了。但我也在寻找使用聚合框架的想法。

标签: mongodb aggregation-framework


【解决方案1】:

是的,在我的公司,我还必须清理过时的数据。幸运的是,该集合的文档有一个过时的日期(基本上是“最后修改日期”),我能够使用 Java 剔除通过阈值的文档集合。

我可能会编写一个每天触发运行的组件或脚本,它会查看文档中的一个元素(希望是日期),然后开始删除每四个元素或不基于返回的对象数组的元素 X旧的时间。

【讨论】:

  • 这是我最初的想法,但我希望能以某种方式使用 TTL 功能来省去我的麻烦。使用脚本方法,我获得了更多控制权,但它也添加了更多组件。很高兴我们的想法相同。
【解决方案2】:

mongo TTL 索引是每个文档的。见:https://docs.mongodb.com/manual/core/index-ttl/

您需要一个具有日期值的字段。在您的情况下,我建议将此字段设置为您希望文档过期的日期,然后创建如下索引:

db.collection.createIndex( { "expireAt": 1 }, { expireAfterSeconds: 0} )

这将使 mongo 在到达该日期时使文档过期。

请记住,正如您所提到的,您需要事先确定到期日期,因此您需要在插入文档时完成 1/4 的工作。

【讨论】:

  • 您好,感谢您提供的信息。我现在没有非常重要的历史数据,所以我可以处理未来的事情。所以你说的是,我必须在每个包含时间的文档中创建一个额外的数据字段,然后将该数据与 createIndex 方法结合使用。很明显,它会让我的数据多占用 25% 的空间。
  • 是的,它会为字段和索引使用空间,好处是您不需要每 x 小时运行一次作业来清理,mongo 会在内部处理所有这些。这有点取决于您拥有的数据,如果您的文档已经在 ObjectId 上,您也可以使用它来确定插入时间戳,在这种情况下,使用清理作业根本不会增加存储空间。
猜你喜欢
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-07
  • 1970-01-01
  • 2021-11-30
相关资源
最近更新 更多