Mongoose 中的时间戳和 TTL 索引的实现方法

阅读时长 5 分钟读完

在使用 Mongoose 进行数据库操作的过程中,时间戳和 TTL 索引是非常常见的使用场景。本文将介绍 Mongoose 中时间戳和 TTL 索引的实现方法以及相关的学习和指导意义。

时间戳

Mongoose 中的时间戳是指为每一个文档记录创建和修改时间。在 Mongoose 中实现时间戳有两种方法:使用 Timestamps 插件和手动定义创建/修改时间字段。

Timestamps 插件

Timestamps 插件是 Mongoose 内置的插件,可以自动记录每个文档的创建和修改时间。它可以在 Schema 中直接使用,代码如下:

上面的代码中,timestamps 选项开启了 Timestamps 插件的自动记录功能。此时,schema 对象中会自动添加两个字段:

  • createdAt 表示文档创建时间,类型为 Date。
  • updatedAt 表示文档修改时间,类型为 Date。

这两个字段的类型都是 Date,可以进行日期操作。

手动定义创建/修改时间字段

手动定义时间戳可以更灵活地控制时间戳字段的名称和类型。在文档创建时手动为时间戳字段赋值来记录创建时间,在文档修改时更新时间戳字段来记录修改时间。在 Mongoose 中实现手动定义创建/修改时间字段需要使用 Schema 中的方法 presave,代码如下:

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

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

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

上面的代码中,我们手动定义了两个时间戳字段 createdAtupdatedAt,并定义了 pre 中间件,在保存文档前更新这两个字段的值。如果文档是新建的,那么 createdAtupdatedAt 都被设置为当前时间;如果文档是修改的,那么只有 updatedAt 被更新。

TTL 索引

在某些场景下,我们需要使某些文档在一定时间后自动删除,例如聊天记录、日志记录等。这时可以使用 Mongoose 的 TTL(Time To Live)索引来自动删除文档。TTL 索引需要在 Schema 中定义时间戳字段,然后将这个字段作为索引,同时设置过期时间。在 Mongoose 中实现 TTL 索引需要使用 Schema 中的方法 index,代码如下:

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

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

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

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

上面的代码中,我们为消息记录添加一个 createdAt 时间戳字段,并在 Schema 中使用方法 index 将这个字段作为索引。其中 expires 字段设置了过期时间,表示这个索引在 createdAt 字段值加上 7d 后自动删除。注意,expires 字段的值可以是时间字符串或数字,具体参考 MongoDB 文档。

指导意义

本文介绍了 Mongoose 中时间戳和 TTL 索引的实现方法。注意,Mongoose 中 Timestamps 插件只支持在 $save$insert 时自动更新时间戳,updateOneupdateMany 等方法并不会更新时间戳,需要手动调用。

同时,如果数据量很大,TTL 索引会对数据库性能产生影响,因此需要注意索引的大小和过期时间。TTL 索引非常适合用于日志、聊天记录等场景。

本文的示例代码可在 Github 上查看:https://github.com/hugeorange/mongoose-timestamp-ttl-demo

结论

本文介绍了 Mongoose 中时间戳和 TTL 索引的实现方法,Timestamps 插件和手动定义创建/修改时间字段两种方法都能实现时间戳功能,TTL 索引适合自动删除过期数据。掌握这些技术可以让我们更加规范和高效地管理数据库,提高代码的可读性和可维护性。

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

纠错
反馈