如何避免Mongoose全局插件作用于嵌套子Schema?
解决Mongoose全局插件作用于子Schema的问题
你遇到的这个问题是因为Mongoose全局注册的插件会默认应用到所有Schema,包括嵌套的子Schema。要解决这个问题,有两种常用的方案,你可以根据自己的需求选择:
方案一:仅在需要的Schema上单独注册插件
如果不是所有Schema都需要mongoose-delete和mongoose-timestamp,最直接的方式就是取消全局注册,只在catScheme上注册这两个插件:
修改你的分类Schema代码:
import mongoose from 'mongoose'; import { imageScheme } from './data.schemas'; const Schema = mongoose.Schema; // 取消全局插件注册,仅给需要的Schema单独注册 const catScheme = new Schema({ title: { type: String }, subTitle: { type: String }, description: { type: String }, images: [imageScheme], icon: { type: String }, deleteAt: { type: Date, default: null } }, { // 启用mongoose-timestamp的时间戳功能(等价于注册插件) timestamps: true }); // 给当前Schema注册mongoose-delete插件 catScheme.plugin(require('mongoose-delete')); const Category = mongoose.model('Category', catScheme); export default Category;
你的imageScheme保持原样即可,这样插件就只会作用于Category模型,不会影响嵌套的images数组里的对象。
方案二:在子Schema中明确禁用插件功能
如果你必须全局注册这两个插件(比如其他Schema也需要用到),可以在定义imageScheme时,通过Schema选项禁用插件的效果:
修改你的imageScheme代码:
const mongoose = require('mongoose'); const Schema = mongoose.Schema; const imageScheme = new Schema({ imageCaption : { type: String }, imageFileName: { type: String, required: true }, imagePath: { type: String, required: true } }, { // 禁用mongoose-timestamp的自动时间戳生成 timestamps: false, // 禁用mongoose-delete的软删除字段和方法 mongooseDelete: { enabled: false } }); export { imageScheme };
这样即使全局注册了插件,imageScheme也会忽略这些插件的作用,嵌套的images对象就不会再出现createdAt、updatedAt和deleted字段了。
验证效果
修改后重新创建分类,你会得到类似这样的文档结果:
{ "_id" : ObjectId("5d5a822f20179023e008f10c"), "deleteAt" : null, "deleted" : false, "title" : "Eyes and Ears", "description" : "here you will find all ppe to keep your eye 6 sharp", "icon" : "glass.svg", "images" : [ { "_id" : ObjectId("5d5a822f20179023e008f10e"), "imageCaption" : "Eyes and Ears", "imageFileName" : "67acca17-3fc8-416c-bc00-8273770b2115.jpeg", "imagePath" : "resources/images/67acca17-3fc8-416c-bc00-8273770b2115.jpeg" }, { "_id" : ObjectId("5d5a822f20179023e008f10d"), "imageCaption" : "Eyes and Ears", "imageFileName" : "9f1c5b1f-c1be-48f2-a9bc-8294930fd4c9.jpeg", "imagePath" : "resources/images/9f1c5b1f-c1be-48f2-a9bc-8294930fd4c9.jpeg" } ], "updatedAt" : ISODate("2019-08-19T11:04:15.756Z"), "createdAt" : ISODate("2019-08-19T11:04:15.756Z"), "__v" : 0 }
可以看到,images数组里的对象已经没有多余的插件生成字段了。
内容的提问来源于stack exchange,提问作者Mohamed Maher
相关产品推荐
相关产品推荐

