Mongo 作为循环缓冲区

Mongo as circular buffer

我正在尝试找出一种将 Mongo 用作循环缓冲区的方法。 目前使用 SQL Lite 但性能方面不适合我们的情况。 需要满足的规范是: 该集合必须每 x 秒清空一次。 当达到 y 个文档的限制时,集合必须自行清空。

通过 Mongo 文档,上限集合和更改事件似乎是一个可行的方法。

https://docs.mongodb.com/manual/core/capped-collections/

https://docs.mongodb.com/manual/reference/change-events/

在文档中指出:“Capped collections 的工作方式类似于循环缓冲区”

但是我不确定如何:

  1. 每 x 秒清空一次集合。 Mongo TTL 功能不可行,因为上限 collections.Other 替代方案不支持 TTL?
  2. 检索任何“已删除的文档”。 更换操作类型的更改事件似乎是 aproach.Other 替代方案?

有没有人试过使用Mongo作为循环缓冲区? 上面的 -Capped Collections/Change 事件 - 是实现它的方法吗?

感谢您的回复。

来自https://en.wikipedia.org/wiki/Circular_buffer

a circular buffer [...] is a data structure that uses a single, fixed-size buffer as if it were connected end-to-end.

恐怕您引用的“Capped collections work in a way similar to circular buffers”正是使用了循环缓冲区的这个定义。

上限集合的大小上限为 and/or 个文档。旧文档不会被计时器删除,而会被新文档删除。把它想象成新文件覆盖旧文件。

遗憾的是,此功能无法从集合 https://docs.mongodb.com/manual/core/capped-collections/#document-deletion 中删除文档。既不是通过 TTL 也不是明确地。并且由于没有正式删除,所以变更流中没有删除事件。

简单来说,如果您需要检索从缓冲区中逐出的文档,您需要自己实现。

TTL 索引可能适合您,但它有时间限制,不受大小限制。它将向变更流发出删除事件,但需要考虑以下三点:

  • 您将需要维护 changestream 客户端 运行 确保您捕获所有事件。
  • TTL索引过程自带成本。每分钟 Mongodb 运行 TTL 监视器线程以删除过时的文档。它消耗资源。不如 sqlite 那么多,但系统性能可能会降低,并且如果它忙于其他操作,则可能不会在指定的时间后准确删除文档。

最好自己控制并 select/delete 记录。我知道您已经有一些使用 sqlite 的实现,所以只需将其调整为使用 mongodb 即可。

db.collection.find({}).sort({_id:-1}).limit(1)

请问return你最老的文档。它使用默认索引并且应该表现良好。