MongoDB 中通过 TTL 索引自动删除过期数据

阅读时长 3 分钟读完

在我们的 Web 应用程序中,经常需要处理一些过期数据。例如用户令牌、密码重置令牌、电子邮件确认链接等。这些数据的生命周期有限,一旦过期,它们就不再有任何用处。在传统的关系型数据库中,我们必须编写一些代码来手动删除过期的记录。但是,在 MongoDB 中,我们可以通过 TTL(Time-To-Live)索引自动删除过期数据。

TTL 索引是什么?

TTL 索引是一种特殊类型的索引,可将文档标记为自动过期。通过指定 _id 字段和一个“过期”字段,可以创建 TTL 索引。MongoDB 将在指定的时间(以秒为单位)之后自动从集合中删除过期文档。

如何使用 TTL 索引?

让我们看一个例子。假设我们有一个用户活动日志集合。这是一个使用 Node.js 和 Mongoose(MongoDB 的 ODM)创建集合的示例代码:

-- -------------------- ---- -------
----- -------- - --------------------

----- ----------------- - --- -----------------
  ------- - ----- ------------------------------- ---- ------ --
  --------- - ----- ------ --
  ------------- - ----- ----- -------- -------- -
---

----- ----------- - ----------------------------- -------------------

-------------- - ------------

接下来,我们将在 lastActiveAt 字段上创建 TTL 索引,以便 MongoDB 自动删除超过 30 秒未活动的用户活动日志。以下是代码:

请注意 expires 属性。它将 TTL 索引的过期时间设置为 30 秒。当 lastActiveAt 字段的时间戳超出 30 秒时,MongoDB 将自动删除文档。

深入了解 TTL 索引

  • TTL 索引只能用于 Date 或 Date 子类型(例如 Timestamp)的字段。
  • 如果在一个文档中有多个 TTL 索引,则 MongoDB 将使用最近的 TTL 索引的过期时间。
  • 当 MongoDB 删除一个过期文档时,它会在后台执行此操作。这可能会导致删除操作延迟一段时间。
  • 给 TTL 索引添加临时时间戳会取消过期未来文档的自动删除,但这些文档仍然过期。
  • 不建议在活动数据库中创建 TTL 索引。这可能会影响数据库性能。最好使用备份和归档数据库上的 TTL 索引。

总结

通过 TTL 索引可以轻松地自动删除过期数据。它不仅方便了开发人员,还有助于优化数据库性能。我们使用 Mongoose 和 Node.js 创建了一个用户活动日志集合,并演示了如何使用 TTL 索引自动删除过期日志。希望本文对你有所帮助。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64523e15675af4061b5dc7d4

纠错
反馈