Mongoose-modified-at 时间自动记录插件介绍
Mongoose-modified-at
是一款自动更新字段变化时间并记录到数据库中的 Mongoose
插件,类似 Mongoose
自带的 timestamps
功能。
使用场景
让我们考虑一个场景,我们有个文章发布与展示的需求,数据模型如下。
const schema = new mongoose.Schema({ // 文章标题 title: String, // 是否为草稿 is_draft: Boolean, // 是否推荐 is_recommended: Boolean, // 更多字段... })
要实现该功能我们需要在代码逻辑层进行处理,这样可行不过有点耦合,或者自己封装一个 Mongoose
中间件来做这件事,不过现在你可以把这件事交给一个经受测试、API
优雅的插件 ModifiedAt
来处理。当我们在展示最新文章列表时,应该是以文章第一次发布的时间倒序展示,因为文章可以存为草稿,多次编辑,所以不能用 Mongoose
提供的 createdAt
或 updatedAt
作为第一次发布的时间,正确的做法是在每次文章创建或更新时,确定用户是发布文章而不是存为草稿,然后记录此次时间,用该时间作为第一次发布的时间。
首先安装插件。
npm install mongoose-modified-at --save
然后在 Schema
初始化时做简单的配置即可,如下。
import modifiedAt from 'mongoose-modified-at' // 在 mongoose.model 调用之前 schema.plugin(modifiedAt, { // 函数名将作为字段名写入数据库 publishedAt(doc) { // 当函数返回值为 true 时,则记录该时间 return !doc.is_draft }, // 推荐文章也是如此 recommendedAt(doc) { return doc.is_recommended }, }) const Article = mongoose.model('Article', schema)
当文档保存或更新携带着 is_draft
字段并且值为 false
时,插件就会记录此次时间到你声明的 publishedAt
字段上一起写入数据库。
示例如下:
await Article.create({ title: 'Document Title', is_draft: false, is_recommended: true, // 更多字段... })
结果如下(数据库):
{ "title": "Document Title", "is_draft": false, "is_recommended": true, "publishedAt": ISODate("2019-09-27T03:11:07.880Z"), "recommendedAt": ISODate("2019-09-27T03:11:07.880Z"), // 更多字段... }
API介绍
上面是 ModifiedAt
的富 API
形式,即对象格式,全部参数选项如下。
schema.plugin(modifiedAt, { // 设置监听字段 fields: ['name', 'status', 'another'], // 设置后缀 suffix: '_your_suffix', // 设置路径默认行为 select: true, // 自定义字段 customField(doc) { // 做一些你想做的事,然后返回 Boolean 值,告诉插件是否记录时间 }, })