带有嵌套可选对象和必填字段的猫鼬模式
Posted
技术标签:
【中文标题】带有嵌套可选对象和必填字段的猫鼬模式【英文标题】:Mongoose Schema with nested optional object with required fields 【发布时间】:2015-06-04 15:28:42 【问题描述】:我想创建一个 Mongoose Schema,它通过以下限制验证以下对象:
field2 是可选的(0-1 关系), 如果 field2 存在,则 field2.type 是必需的(注意该字段的名称是“type”作为类型定义的猫鼬保留字), field2 和基础对象必须在同一个文档中。代码示例
field1: "data",
field2:
type: "data",
data: "data"
提前致谢。
【问题讨论】:
Mongoose 嵌套验证充其量是错误的。如果您使用嵌套的东西,我建议您编写自己的验证。见github.com/Automattic/mongoose/issues/1919 @ChrisHoughton 谢谢。我发现 Mongoose 非常错误且不完整。我正在考虑转向 mongodb 驱动程序并编写约束和验证代码。 Mongoose Schema with nested optional object的可能重复 【参考方案1】:你可以refer to this answer:
field1: "your data",
field2:
type:
"your data"
,
required: false
所以一个例子是:
field1: String,
field2:
type:
nestedField1: type: String, required: true ,
nestedField2: String
,
required:false
如果存在field2
,则需要nestedField1
。
【讨论】:
【参考方案2】:@Mina Michael 答案对我不起作用,但是,当我稍作调整时,它对我有用。我试过这样:
field1: String,
field2:
type: new Schema(
nestedField1: type:Boolean,required:true,
nestedField2: String,
),
required: false
【讨论】:
【参考方案3】:你的意思可能是这样的:
var Field2Schema = new mongoose.Schema(
type: type: String, required: true ,
data: String
);
var MainSchema = new mongoose.Schema(
field1: String,
field2: Field2Schema
);
【讨论】:
投反对票。这可以在单个集合的模式中完成,这正是 OP 想要的。 @EnKrypt:请提供正确答案。 糟糕,虽然我认为这个答案完全不正确,但这仍然不是最佳书面解决方案。无需像这样定义嵌套模式并将它们拼凑在一起。在较长的模式中,菊花链不仅难以维护,而且比仅在同一位置为每个子对象定义模式要慢。奥卡姆剃刀适用于此。 我已经编辑了答案以反映更简单、更好的解决方案,但由于我没有所需的声誉,我需要在 SO 让我删除我的反对票之前批准编辑。谢谢你帮我解决了我的错误,说实话我觉得很尴尬。【参考方案4】:如何将具有此架构的数据插入到 db.. 主要是那些嵌套字段...employee.namefirst = req.body.namefirst;
//first = req.body.namefirst;
employee.name.middle = req.body.namemiddle;
employee.name.last = req.body.namelast;
【讨论】:
name: first: type: String, required: true , middle: type: String, required: false , last: type: String, required: true ..这是我的架构定义..如何插入以上是关于带有嵌套可选对象和必填字段的猫鼬模式的主要内容,如果未能解决你的问题,请参考以下文章