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"),
// 更多字段...
}

附加案例

作为渐进式项目,我们的开发一般也是渐进式的,虽然我们会不自觉地超前考虑,但是还是不能完全考虑到未来需求的变化,假如我们对某个项目的功能已经完成并稳定上线了,后来比如我们需要做数据统计分析的工作,这项工作的分析维度对时间的要求比较高,所以要是我们在开发时并没有考虑到要添加这些时间字段(因为可能对业务不是必须的),而现在需要加上这些字段,要是去原来的代码基础上改动添加,如果改动的地方少还好,如果有完善的测试用例还好,否则这也许会改的心惊胆战,因为你需要确保改动不会产生任何错误影响。所以此时,使用无侵入式的中间件插件 ModifiedAt 那就省心很多了,只需在模型出口简单配置,无需改动逻辑层代码,即可实现刚刚想要的功能需求。

API介绍

上面是 ModifiedAt 的富 API 形式,即对象格式,全部参数选项如下。

schema.plugin(modifiedAt, {
// 设置监听字段
fields: ['name', 'status', 'another'],
// 设置后缀
suffix: '_your_suffix',
// 设置路径默认行为
select: true,
// 自定义字段
customField(doc) {
// 做一些你想做的事,然后返回 Boolean 值,告诉插件是否记录时间
},
})

最新文章

  1. WPF中Grid实现网格,表格样式通用类
  2. 使用视 meta 标签来控制手机浏览器布局
  3. 十进制(decimal system)转换函数说明
  4. oneuijs/You-Dont-Need-jQuery
  5. RDIFramework.NET-.NET快速信息化系统开发整合框架 【开发实例 EasyUI】之产品管理(MVC版)
  6. ARM的QT phonon 的移植
  7. Unity3d自定义脚本模板
  8. .h头文件和.c文件的作用和区别
  9. RMAN数据库异机迁移步骤
  10. Farming
  11. HDU 1535 Invitation Cards(SPFA,及其优化)
  12. win10 uwp 改变鼠标
  13. Java经典编程题50道之四十
  14. [JS] Topic - why "strict mode" here
  15. 2、申请苹果App ID
  16. stark组件之批量操作【模仿Django的admin】
  17. 8.4 正睿暑期集训营 Day1
  18. Let's Encrypt申请免费SSL证书
  19. Docker 命令总结
  20. 【PHP】算法进阶,获取给定值的最优组合:虚拟币抵扣问题解决方案

热门文章

  1. SpringBoot启动zipkin-server报错Error creating bean with name ‘armeriaServer’ defined in class path resource
  2. Centos利用脚本自动安装jdk
  3. 月光宝盒之时间魔法--java时间的前生今世
  4. LoadRuuner资源监控
  5. 轻松部署calico
  6. 小鸟初学Shell编程(七)变量引用及作用范围
  7. freemarker模版引擎技术总结
  8. 详解es6 class语法糖中constructor方法和super的作用
  9. Transactional事务提交后触发异步方法
  10. ELK 学习笔记之 Logstash之codec配置