带有嵌套可选对象和必填字段的猫鼬模式

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 ..这是我的架构定义..如何插入

以上是关于带有嵌套可选对象和必填字段的猫鼬模式的主要内容,如果未能解决你的问题,请参考以下文章

具有多个和可选字段的猫鼬查找

用于多个对象数组的猫鼬嵌套模式

嵌套模式/子文档对象中的猫鼬 findById() - 聚合

从带有子字段的猫鼬模式生成 Graphql 类型

如何在猫鼬中自动创建必填字段

SpringFox Swagger - 模型中的可选和必填字段