在使用 Mongoose 进行数据库操作的过程中,时间戳和 TTL 索引是非常常见的使用场景。本文将介绍 Mongoose 中时间戳和 TTL 索引的实现方法以及相关的学习和指导意义。
时间戳
Mongoose 中的时间戳是指为每一个文档记录创建和修改时间。在 Mongoose 中实现时间戳有两种方法:使用 Timestamps 插件和手动定义创建/修改时间字段。
Timestamps 插件
Timestamps 插件是 Mongoose 内置的插件,可以自动记录每个文档的创建和修改时间。它可以在 Schema 中直接使用,代码如下:
const mongoose = require('mongoose'); const schema = new mongoose.Schema({ ... }, { timestamps: true });
上面的代码中,timestamps
选项开启了 Timestamps 插件的自动记录功能。此时,schema
对象中会自动添加两个字段:
createdAt
表示文档创建时间,类型为 Date。updatedAt
表示文档修改时间,类型为 Date。
这两个字段的类型都是 Date,可以进行日期操作。
手动定义创建/修改时间字段
手动定义时间戳可以更灵活地控制时间戳字段的名称和类型。在文档创建时手动为时间戳字段赋值来记录创建时间,在文档修改时更新时间戳字段来记录修改时间。在 Mongoose 中实现手动定义创建/修改时间字段需要使用 Schema 中的方法 pre
和 save
,代码如下:
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ------ - --- ----------------- ---- ---------- - ----- ----- -------- -------- -- ---------- - ----- ----- -------- -------- - --- ------------------ -------- ------ - -- ------------ - -------------- - -------------- - ----------- - ---- - -------------- - ----------- - ------- ---
上面的代码中,我们手动定义了两个时间戳字段 createdAt
和 updatedAt
,并定义了 pre
中间件,在保存文档前更新这两个字段的值。如果文档是新建的,那么 createdAt
和 updatedAt
都被设置为当前时间;如果文档是修改的,那么只有 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
时自动更新时间戳,updateOne
、updateMany
等方法并不会更新时间戳,需要手动调用。
同时,如果数据量很大,TTL 索引会对数据库性能产生影响,因此需要注意索引的大小和过期时间。TTL 索引非常适合用于日志、聊天记录等场景。
本文的示例代码可在 Github 上查看:https://github.com/hugeorange/mongoose-timestamp-ttl-demo
结论
本文介绍了 Mongoose 中时间戳和 TTL 索引的实现方法,Timestamps 插件和手动定义创建/修改时间字段两种方法都能实现时间戳功能,TTL 索引适合自动删除过期数据。掌握这些技术可以让我们更加规范和高效地管理数据库,提高代码的可读性和可维护性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6772113c6d66e0f9aad43ef8