在 MongoDB 中,TTL 索引可以帮助我们自动删除某些过期的文档,非常方便。Mongoose 是一种流行的 Node.js 框架,它为我们提供了使用 MongoDB 数据库时的抽象层。本文将介绍如何在 Mongoose 中使用 TTL 索引,并开始使用一个示例来演示它的应用和实践。
TTL 索引是什么?
TTL 索引是 MongoDB 中的一种索引,它可以帮助我们自动删除某些过期的文档。它通过一个特殊的字段 expireAfterSeconds
来控制,在创建索引时设置,表示文档应该在该字段的值之后的一段时间后过期。例如,如果我们有一个 created_at
字段,我们可以创建一个 TTL 索引,过期时间是 24 小时:
db.collection.createIndex( { "created_at": 1 }, { expireAfterSeconds: 86400 } )
这个索引将会在创建后启动自动删除过期文档的功能。
在 Mongoose 中创建 TTL 索引
要在 Mongoose 中使用 TTL 索引,我们可以使用 schema.index()
方法来定义索引并传递特定的选项。我们可以在模式中定义一个字段来启用过期功能,比如 expiresAt
:
-- -------------------- ---- ------- ----- ------ - --- ----------------- ----- ------- ----------- - ----- ----- -------- ---------- -- ---------- - ----- ----- -------- --------- ------ --------- ----- - ---
这里我们定义了一个 expiresAt
字段,类型是 Date
,默认值是当前时间。我们将其定义为一个 TTL 索引,过期时间是 1 天。请注意,我们也定义了一个 name
字段和一个 created_at
字段,它们与我们的示例应用程序有关。
过期事件
当一个文档过期时,MongoDB 发出一个过期事件。我们可以使用 MongoDB 的模块驱动程序来监听此事件,在应用程序中采取适当的操作。在 Mongoose 中,我们可以在模式定义中添加一个 expires
事件来监听过期事件,如下所示:
-- -------------------- ---- ------- ----- ------ - --- ----------------- ----- ------- ----------- - ----- ----- -------- ---------- -- ---------- - ----- ----- -------- --------- ------ --------- ----- - --- -------------- ---------- - -- - ------------------- - --- ------------------ -------- ----- - -- ----- - ------------------- - ---- - ---------------- ----- -- ----- -- ------ - --- ---------------------- -------- ----- - --------------------- --- ---- ---------- ----- -- -- ---- ----- ---- ---
这里我们定义了一个 expiresAt
事件,它在文档过期时被触发。我们在事件处理程序中打印了一条消息,以便我们可以看到文档已过期。在这里,你可以编写你自己的业务逻辑以执行文档删除或其他操作。
示例应用
让我们来看一个演示 Mongoose 中 TTL 索引使用的示例应用,以更完整地了解它的应用和实践。
首先,我们需要创建一个新的 Mongoose 模型,该模型代表我们要存储和管理的数据:
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ---------- - --- ----------------- ------ ------- -------- ------- ----------- - ----- ----- -------- ---------- -- ---------- - ----- ----- -------- --------- ------ - -------- ---- - - --- -------------- - ---------------------- ------------
在这里,我们定义了一个 Blog
模型,它包含标题、内容和创建日期。我们还定义了一个 expiresAt
字段,用于处理 TTL 索引。在这个例子中,过期日期是 1 分钟。
接下来,我们需要编写一些路由处理程序来处理我们的请求。我们需要创建一个用于创建博客文章的路由,一个用于获取所有博客文章的路由,以及一个用于删除过期博客文章的路由:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ------ - ----------------- ----- ---- - -------------------------- --------------------- ----- ---- -- - ----- ---- - --- ------ ------ --------------- -------- ---------------- --- ----------- ---------- -- --------------- ---------- -- ---------------------- ------ ----------- ---- --- -------------------- ----- ---- -- - ----------- ----------- -- ---------------- ---------- -- ---------------------- ------ ----------- ---- --- ----------------------- ----- ---- -- - ----------------- ---------- - ---- --- ------ - -- -------- -- ---------- -------- -------- ----- --------- --- ---------- -- ---------------------- ------ ----------- ---- --- -------------- - -------
在这里,我们定义了三个路由处理程序。第一个处理程序用于创建博客文章,第二个处理程序用于获取所有博客文章,第三个处理程序用于删除过期博客文章。在删除路由处理程序中,我们使用了 Blog.deleteMany({ expiresAt: { $lt: new Date() } })
来查找并删除所有过期博客文章。
现在我们可以测试我们的应用程序了!运行应用并访问 http://localhost:3000/blogs 来查看发送的博客文章。我们可以通过 Postman 等工具来创建测试数据。
现在等待了一分钟后,执行 http://localhost:3000/blogs 路由中的删除处理程序。过期时间为 1 分钟,所以在 1 分钟后该路由会返回一个带有“已删除”消息的响应,从数据库中删除已过期的博客文章。
结论
在本文中,我们介绍了 Mongoose 中的 TTL 索引及其实际应用和实践。我们了解了如何在 Mongoose 模式中定义和使用 TTL 索引,以及如何编写路由处理程序来删除过期文档。希望这篇文章能帮助你更好地理解 Mongoose 中的 TTL 索引。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/672882d12e7021665e207e30