在我们的 Web 应用程序中,经常需要处理一些过期数据。例如用户令牌、密码重置令牌、电子邮件确认链接等。这些数据的生命周期有限,一旦过期,它们就不再有任何用处。在传统的关系型数据库中,我们必须编写一些代码来手动删除过期的记录。但是,在 MongoDB 中,我们可以通过 TTL(Time-To-Live)索引自动删除过期数据。
TTL 索引是什么?
TTL 索引是一种特殊类型的索引,可将文档标记为自动过期。通过指定 _id 字段和一个“过期”字段,可以创建 TTL 索引。MongoDB 将在指定的时间(以秒为单位)之后自动从集合中删除过期文档。
如何使用 TTL 索引?
让我们看一个例子。假设我们有一个用户活动日志集合。这是一个使用 Node.js 和 Mongoose(MongoDB 的 ODM)创建集合的示例代码:
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ----------------- - --- ----------------- ------- - ----- ------------------------------- ---- ------ -- --------- - ----- ------ -- ------------- - ----- ----- -------- -------- - --- ----- ----------- - ----------------------------- ------------------- -------------- - ------------
接下来,我们将在 lastActiveAt
字段上创建 TTL 索引,以便 MongoDB 自动删除超过 30 秒未活动的用户活动日志。以下是代码:
const activityLogSchema = new mongoose.Schema({ userId: { type: mongoose.Schema.Types.ObjectId, ref: "User" }, activity: { type: String }, lastActiveAt: { type: Date, default: Date.now, expires: 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