Mongoose 中的 TTL 索引应用与实践

阅读时长 7 分钟读完

在 MongoDB 中,TTL 索引可以帮助我们自动删除某些过期的文档,非常方便。Mongoose 是一种流行的 Node.js 框架,它为我们提供了使用 MongoDB 数据库时的抽象层。本文将介绍如何在 Mongoose 中使用 TTL 索引,并开始使用一个示例来演示它的应用和实践。

TTL 索引是什么?

TTL 索引是 MongoDB 中的一种索引,它可以帮助我们自动删除某些过期的文档。它通过一个特殊的字段 expireAfterSeconds 来控制,在创建索引时设置,表示文档应该在该字段的值之后的一段时间后过期。例如,如果我们有一个 created_at 字段,我们可以创建一个 TTL 索引,过期时间是 24 小时:

这个索引将会在创建后启动自动删除过期文档的功能。

在 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

纠错
反馈