📦 Mongoose Schema Auditor — Mongoose 模式审计员
v1.0.0审计 Mongoose 模式定义以确保最佳实践、性能和数据完整性。检查模式设计、索引策略、人口效率、精简查询等。
运行时依赖
安装命令
点击复制技能文档
Mongoose 模式审计员 审计 Mongoose 模式定义以确保正确性、性能和数据完整性。审查模式设计、索引策略、人口链、中间件钩子、虚拟字段、辨别器、分页模式和连接管理。作为一名高级 MongoDB 工程师,审计您的 Mongoose 模型以确保生产就绪。
使用 在需要审查 Mongoose 模式、优化查询性能或验证数据建模最佳实践时调用此技能。 基本调用: 审计 /path/to/models/ 目录中的 Mongoose 模式 审查此 Mongoose 模型以获取最佳实践 检查整个项目的 Mongoose 查询性能 专注分析: 审计所有 Mongoose 模型的索引策略 审查人口链以检测 N+1 风险 检查中间件钩子以检测副作用问题 分析分页模式以比较光标和偏移量
代理读取 Mongoose 模型文件,解析模式定义和查询模式,并生成综合质量报告。
工作原理 步骤 1:发现和解析模型文件 代理定位所有 Mongoose 模型定义: # 查找模型文件 find /path/to/src/ -name ".model.ts" -o -name ".model.js" -o -name ".schema.ts" -o -name ".schema.js" # 查找包含 mongoose.model() 调用的文件 grep -rl "mongoose.model\|new Schema\|Schema(\|model(" /path/to/src/ --include=".ts" --include=".js" # 查找人口模式 grep -rn "\.populate(" /path/to/src/ --include=".ts" --include=".js" # 查找查询模式 grep -rn "\.find(\|\.findOne(\|\.findById(\|\.aggregate(" /path/to/src/ --include=".ts" --include=".js"
代理解析每个模型文件以提取: 模式定义(字段、类型、嵌套模式) 索引定义(单个、复合、文本、TTL、地理空间) 虚拟字段(getter、setter、人口虚拟) 中间件钩子(预/后保存、验证、删除、查找) 静态和实例方法 辨别器(继承模式) 插件使用(mongoose-paginate、mongoose-delete 等) 人口引用(ref、人口路径)
步骤 2:审计模式设计 代理检查每个模式的结构设计: 字段类型分析: // 好的:设计良好的模式 const userSchema = new Schema({ email: { type: String, required: [true, "Email 是必需的"], unique: true, lowercase: true, trim: true, match: [/^\S+@\S+\.\S+$/, "无效的电子邮件格式"], index: true, }, name: { type: String, required: true, trim: true, minlength: [1, "名称不能为空"], maxlength: [100, "名称太长"], }, role: { type: String, enum: { values: ["user", "admin", "moderator"], message: "{VALUE} 不是有效的角色", }, default: "user", }, metadata: { type: Map, of: String, }, }, { timestamps: true, toJSON: { virtuals: true }, toObject: { virtuals: true }, });
// 代理检测到的问题: 失败:模式 "User" 字段 "email" — 类型:String,无 trim 或 lowercase 用户可以注册 " User@EXAMPLE.com " 和 "user@example.com" 作为不同的帐户 修复:添加 lowercase:true,trim:true 失败:模式 "Product" 字段 "price" — 类型:Number,无最小值约束 可能出现负价格 —— 数据库级别 修复:添加 min:[0,"价格不能为负数"] 失败:模式 "Order" 字段 "status" — 类型:String,无枚举约束 接受任何字符串值 —— "active"、"ACTIVE"、"actve" 都是有效的 修复:添加 enum:["pending"、"processing"、"shipped"、"delivered"、"cancelled"] 警告:模式 "Post" 字段 "content" — 类型:String,无最大长度 风险:无界字符串字段 —— 单个文档可以增长到 16 MB 限制 修复:添加 maxlength:[50000,"内容超过最大长度"] 失败:模式 "Comment" 深度嵌套的子文档数组(3 级深) comments[]。replies[]。reactions[] 风险:无界嵌套数组可能超过 16 MB 文档限制 风险:无法高效地索引深度嵌套数组中的字段 修复:将回复和反应建模为单独的集合,带有引用 警告:模式 "UserProfile" 使用 Mixed 类型的 "preferences" 字段 Mixed 类型禁用更改检测 —— 必须调用 markModified() 修复:为首选项定义显式子模式: preferences: { theme: String, language: String, notifications: Boolean } 警告:模式 "Event" 没有时间戳选项 修复:添加 { timestamps: true } 到模式选项 自动管理 createdAt 和 updatedAt 字段 模式选项审计: 失败:模式 "User" —— 没有 toJSON 转换 密码哈希、内部 ID 和 __v 暴露在 API 响应中 修复:添加转换到 toJSON: toJSON: { transform(doc, ret) { delete ret.password; delete ret.__v; ret.id = ret._id; delete ret._id; } } 警告:模式 "Post" —— 启用 versionKey (__v) __v 字段消耗存储,但很少正确使用 大多数应用程序没有实现乐观并发控制 修复:如果不使用 OCC:{ versionKey: false }