You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:07:18