Mongoose核心概念——中间件

之前的文章以一个demo介绍了Mongoose的入门知识,本文深入Mongoose介绍它的核心概念------中间件。

中间件又称为 pre-hook 和 post-hook,它是在特定动作之前或特定动作之后要执行的函数,比如说,你想在 document 保存到数据库之前执行某些函数,那么应该用 pre-hook 来实现。如果想事后执行什么,那么应该用 post-hook 来实现。pre-hook、post-hook 和特定动作的执行顺序可以总结为:pre-hooks -> method -> post-hooks。

pre-hook 和 post-hook 都需要添加在 Schema 上,并且要在调用 mongoose.model() 之前添加,示例代码如下:

javascript 复制代码
teacherSchema.pre('save', function() {
    console.log('save pre one')
})

teacherSchema.pre('save', function() {
    console.log('save pre two')
})

teacherSchema.post('save', function() {
    console.log('save post one')
})

Mongoose 有 document、model、aggregate 和 query 这 4 种类型的中间件,每类中间件支持的函数有所不同,中间件中 this 的指向也不同,比如 document 中间件支持 save 和 remove 等函数,其 this 指向 document;query 中间件支持 remove 和 find 等函数,其 this 指向 query;model 中间件只支持 insertMany 函数,其 this 指向 model;aggregate 中间件只支持 aggregate 函数,其 this 指向 aggregate 对象。访问 mongoosejs.com/docs/middle... 查看中间件的更多细节。

pre-hook

顾名思义,在特定动作之前要执行的函数要用 pre-hook 来实现,如果在 pre-hook 中发生了错误那么随后要执行的特定动作将不会被执行。在 pre-hook 中可以用 throw 抛出错误,也能返回一个 rejected 的 promise 对象,这两种都会认为 pre-hook 发生了错误。

以下是一些使用 pre-hook 的用例:

  1. 在查询的时候添加额外的查询条件或修改查询条件。
  2. 删除与 document 相关的 document,比如删除用户之前,先删除与他相关的评论等。
  3. 在保存 document 之前格式化用户提交的数据,比如将 firstName 和 lastName 拼接成fullName 再保存到数据库。

post-hook

post-hook在特定动作执行之后执行,访问 mongoosejs.com/docs/middle... 查看它与 pre-hook 在语法上的细微差异。

命名冲突

如前所述,中间件都添加在Schema上,有些函数即被document中间件支持也被query中间件支持,remove就是这样一个例子,此时就出现了命名冲突。需要记住的是,这些有命名冲突的中间件默认是document中间件,如果要将它们用作query中间件,那么添加中间件时需要传递一个配置项。代码如下:

javascript 复制代码
// document 中间件
teacherSchema.pre('remove', { document: true, query: false }, function() {
    console.log('移除 document');
})

// query 中间件
teacherSchema.pre('remove', { document: false, query: true }, function() {
    console.log('即将执行Model.remove(),从 collection 中移除所有符合条件的 document');
})

推荐阅读

  1. 在 macOS 上安装 MongoDB
  2. MongoDB 增删改查操作
  3. Mongoose 入门,从一个 demo 开始
  4. Mongoose核心概念------连接数据库
  5. Mongoose核心概念------Schema
相关推荐
AI全栈实验室10 天前
MongoDB迁移金仓踩了5个坑,最后一个差点回滚
mongodb
数据知道11 天前
MongoDB 元素查询运算符:使用 `$exists` 检查字段是否存在及处理缺失字段
数据库·mongodb
数据知道11 天前
MongoDB 批量写操作:`bulkWrite()` 在数据迁移与清洗中的高性能应用
数据库·mongodb
数据知道11 天前
MongoDB 数组更新操作符:`$push`、`$pull`、`$addToSet` 管理列表数据
数据库·mongodb
数据知道11 天前
MongoDB 更新操作符 `$set` 与 `$unset`:精准修改字段与删除字段
数据库·mongodb
数据知道11 天前
MongoDB 数值更新原子操作:`$inc` 实现点赞、计数器等高并发原子操作
数据库·算法·mongodb
数据知道12 天前
MongoDB 数组查询专项:`$all`、`$elemMatch` 与精确匹配数组的使用场景
数据库·mongodb
数据知道12 天前
MongoDB 正则表达式查询:在 MongoDB 中实现模糊搜索与索引优化陷阱
数据库·mongodb·正则表达式
正在走向自律12 天前
文档数据库替换新范式:金仓数据库MongoDB兼容性深度解析与实践指南
数据库·mongodb·国产数据库·金仓数据库