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
相关推荐
一点晖光1 天前
MongoDB数据迁移方案整理
数据库·mongodb·数据迁移
lhrimperial1 天前
MongoDB核心技术深度解析题
数据库·mongodb
bing.shao2 天前
FerretDB 替换MongoDB符合信创要求
数据库·mongodb
bing.shao2 天前
FerretDB 完美对接 MongoDB
数据库·mongodb
坚定信念,勇往无前5 天前
docker安装mongodb
mongodb·docker·容器
WangHappy6 天前
Mongoose操作MongoDB数据库(2):实现增、删、改、查基础操作
mongoose
云和数据.ChenGuang7 天前
openEuler系统下安装MongoDB的技术教程
运维·数据库·mongodb·压力测试·运维工程师·运维技术
ChristXlx7 天前
Linux安装MongoDB(虚拟机适用)
linux·mongodb·postgresql
2301_796512527 天前
React Native鸿蒙跨平台开发如何使用MongoDB或Firebase作为后端数据库来存储车辆信息、保养记录和预约信息
数据库·mongodb·react native
数据与人8 天前
mongodb报错Sort exceeded memory limit of 104857600 bytes
数据库·mongodb