我正试图找出一种将 Mongo 用作循环缓冲区的方法。 目前使用 SQL Lite 但性能方面不适合我们的情况。 需要满足的规格是: 集合必须每 x 秒清空一次。 当满足 y 个文档的限制时,集合必须自行清空。
通过 Mongo 文档,限制集合和更改事件似乎是一种方法。
https://docs.mongodb.com/manual/core/capped-collections/
https://docs.mongodb.com/manual/reference/change-events/
在文档中指出:“上限集合的工作方式类似于循环缓冲区”
但是我不知道如何:
有没有人试过使用 Mongo 作为循环缓冲区? 上面的-Capped Collections/Change Events- 是实现它的方法吗?
感谢您的回复。
答案 0 :(得分:1)
来自https://en.wikipedia.org/wiki/Circular_buffer:
<块引用>循环缓冲区 [...] 是一种数据结构,它使用单个固定大小的缓冲区,就像端到端连接一样。
恐怕您引用的“上限集合的工作方式类似于循环缓冲区”正是使用了循环缓冲区的这个定义。
上限集合受文档大小和/或数量的限制。旧文件不是由计时器删除,而是由新文件删除。把它想象成新文件覆盖旧文件。
不幸的是,此功能无法从集合 https://docs.mongodb.com/manual/core/capped-collections/#document-deletion 中删除文档。既不是通过 TTL 也不是明确的。并且由于没有正式删除,因此变更流中没有删除事件。
简单来说,如果您需要检索从缓冲区驱逐的文档,您需要自己实现。
TTL 索引可能适合您,但它是有时间限制的,而不是大小限制。它将向变更流发出删除事件,但需要考虑以下三点:
建议您自己控制和选择/删除文档。我知道您已经有一些使用 sqlite 的实现,因此只需将其调整为使用 mongodb。
db.collection.find({}).sort({_id:-1}).limit(1)
将返回给您最旧的文档。它使用默认索引并且应该表现良好。