Mongoose 中文文档与 Node.js 的逻辑删除实现
在 Node.js 的开发中,Mongoose 作为一个 MongoDB 的 ODM 框架被广泛应用。Mongoose 提供了优雅的 API 和丰富的插件,使得 MongoDB 数据库的操作更加简便和灵活。在 Mongoose 中,文档是最基本的数据模型,而逻辑删除是文档处理中经常遇到的操作之一。
一、Mongoose 中文文档
Mongoose 支持中文文档的存储和查询,只需要在定义模型时指定对应字段的数据类型为 String,如下所示:
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ------ - ---------------- ----- ---------- - --- -------- ----- - ----- ------- --------- ---- -- ---- - ----- ------- --------- ---- -- ------- - ----- ------- ----- ----- ----- -------- --- -- ------ - ----- ------- --------- ----- -- --- ----- ---- - ---------------------- ------------ -------------- - -----
在需要存储中文的字段中,只需将字段类型设置为 String
即可,如上述的 name
和 intro
。而在查询中文时,也可以直接使用字符串查询,如下所示:
-- -------------------- ---- ------- ----- ---- - ------------------------- ----------- ----- ---- -- ----- ------ -- - -- ----- - ------------------- ------- - ------------------- --
在执行上述查询时,Mongoose 将会自动将查询中的中文字符串转化为 UTF-8 编码进行查询,无需再进行额外的操作。
二、逻辑删除实现
逻辑删除是指将数据标记为已删除,而非直接从数据库中删除,这种方式可以保留删除数据的一些信息,以便后续的数据分析。在 Mongoose 中,实现逻辑删除的方式主要有两种:一种是使用虚拟删除(Virtual Delete)方式,另一种是使用中间件实现删除前的操作。
虚拟删除
虚拟删除的方式是将删除行为转化为更新行为,主要是在模型定义的时候,将所有需要进行逻辑删除的模型加一个 virtual 属性。例如下面的例子:
const userSchema = new Schema({ name: { type: String, required: true }, isDeleted: { type: Boolean, default: false }, }); userSchema.virtual('deleted').set(function(val) { this.isDeleted = val; });
在这里,我们定义了一个虚拟属性 deleted
,当执行 user.deleted = true
时,实际上是将 isDeleted
属性值设为 true
,这也就相当于是将该文档标记为已删除。而在查询时,只需要使用 { isDeleted: false }
作为筛选条件就可以忽略其中已删除的数据:
User.find({ isDeleted: false }, (err, users) => { if (err) { console.error(err); return; } console.log(users); })
中间件实现
另一种实现逻辑删除的方式是使用中间件实现删除前的操作。在 Mongoose 中,中间件主要分为文档中间件(Document Middleware)、模型中间件(Model Middleware)和聚合中间件(Aggregate Middleware)三种类型。其中文档中间件和模型中间件比较常用,文档中间件可以实现数据的创建、更新和删除前的操作,而模型中间件可以实现数据的查询前的操作。
以模型中间件为例,实现逻辑删除的流程如下:
首先,我们在模型中定义中间件,规定删除前的操作。
userSchema.pre('delete', function(next) { this.update({ isDeleted: true }); next(new Error('forbidden operation')); });
这里使用了 pre
方法监听 delete
方法,当执行删除时,将 isDeleted
属性设为 true
,实现逻辑删除。在这里,我们也可以在中间件的回调中抛出错误,以阻止未经授权的删除操作。
接着,在删除的方法中,调用 executeMiddlewares
方法。
userSchema.statics.delete = function(conditions) { const doc = new this(); doc.$where(conditions); return doc.executeMiddlewares('delete', null); };
这里我们将 executeMiddlewares
方法用于传入参数 delete
,表示执行删除前的中间件,这里接受 null
参数,因为我们需要将 this
上下文设置为文档本身。
最后,在代码中调用删除的方法时,只需传入对应的筛选条件即可。
User.delete({ _id: userId }) .then(() => { console.log('删除成功'); }) .catch((err) => { console.error(err.message); })
以上是利用中间件实现逻辑删除的基本流程,实现起来较为复杂,但更灵活,能够满足不同的需求。需要注意的是,虚拟删除和中间件都有可能会影响到模型查询等相关操作,需要结合实际应用进行处理。
总结
本文主要介绍了 Mongoose 中文文档和逻辑删除的实现方法,其中文档的存储和查询相对简单,而逻辑删除则需要结合中间件等技术,实现起来较为复杂。希望本文能够对广大前端开发者有所帮助,为大家的开发工作提供一定的指导价值。
示例代码
-- -------------------- ---- ------- ----- -------- - -------------------- ---------------------------------------------- ----- ------ - ---------------- ----- ---------- - --- -------- ----- - ----- ------- --------- ---- -- ---- - ----- ------- --------- ---- -- ------- - ----- ------- ----- ----- ----- -------- --- -- ------ - ----- ------- --------- ----- -- ---------- - ----- -------- -------- ----- -- --- ----------------------------------------------- - -------------- - ---- --- ------------------------ -------------- - ------------- ---------- ---- --- -------- ---------------- ------------- --- ------------------------- - -------------------- - ----- --- - --- ------- ----------------------- ------ -------------------------------- ------ -- ----- ---- - ---------------------- ------------ ------------- ---- ------ -- -------- -- - -------------------- -- ------------ -- - --------------------------- --
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64cca0d95ad90b6d042a165d