当 mongoose schema 中定义了嵌套对象(如 `comments`)但未明确指定其类型为 `schema.types.embedded` 或正确声明嵌套结构时,mongoose 可能错误地将子字段(如 `comments.text`、`comments.author`)识别为独立必填路径,导致验证失败。
在您提供的 Schema 中,comments 字段被直接写成一个普通对象字面量:
comments: {
text: { type: String },
author: { type: mongoose.Types.ObjectId, ref: "User" },
}
⚠️ 问题根源:Mongoose 将这种写法解释为「comments 是一个嵌套 Schema,且其内部字段 text 和 author 默认继承父级的 required: false 状态」——但实际并非如此。由于未显式声明 comments 的 type 为一个子 Schema,Mongoose 会将 comments.text 和 comments.author 视为顶层路径,并在启用严格模式(默认)或存在其他隐式约束时,意外触发“路径必需”校验,尤其在某些版本或与 TypeScript/ORM 工具链交互时更易暴露。
✅ 正确做法:必须显式将 comments 定义为一个内嵌文档(embedded subdocument),并明确设置 type 为一个 Schema 实例(或等效的对象结构),同时确保 required: false 显式声明(尽管是默认值,但强烈建议显式写出以增强可读性与健壮性):