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 值,告诉插件是否记录时间
  },
})
版权声明:本文为barrior原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/barrior/p/11751085.html