具有必填字段的可选嵌套对象的Mongoose模式

18

我想创建一个Mongoose模式,以以下限制验证下面的对象:

  • field2是可选的(0-1关系),
  • 如果存在field2,则需要field2.type(注意字段名称为"type",作为mongoose类型定义的保留字),
  • field2和基本对象必须在同一文档中。

代码示例:

{
  field1: "data",
  field2: {
    type: "data",
    data: "data"
  }
}

提前致谢。


2
Mongoose嵌套验证最多只能算是有缺陷的。如果您正在使用嵌套内容,我建议您编写自己的验证。请参见https://github.com/Automattic/mongoose/issues/1919 - Chris Houghton
@ChrisHoughton 谢谢。我发现Mongoose很多bug,而且不完整。我正在考虑转移到mongodb驱动程序并编写约束和验证。 - Víctor Herraiz
可能是Mongoose 带有嵌套可选对象的模式的重复内容。 - j3141592653589793238
4个回答

22

您可以参考此答案

{
  field1: "your data",
  field2: {
    type: {
      "your data"
    },
    required: false
  }
}

那么举个例子:

{
  field1: String,
  field2: {
    type: {
      nestedField1: { type: String, required: true },
      nestedField2: String
    },
    required:false
  }
}
如果存在field2,则需要填写nestedField1

1
也许是因为我使用的是较旧版本的Mongoose 5.13.14,所以这对我没有起作用。@uday的答案(https://dev59.com/8V0b5IYBdhLWcg3wSPmL#60318447)对我有用。 - jawang35

13

@Mina Michael 的答案对我没有起作用,但是当我稍微修改一下后,它就对我有用了。我试着这样做:

{
  field1: String,
  field2:{
    type: new Schema({
      nestedField1: {type:Boolean,required:true},
      nestedField2: String,
    }),
    required: false
  }
}

0

你可能想要的是这个:

var Field2Schema = new mongoose.Schema({
  type: { type: String, required: true },
  data: String
});

var MainSchema = new mongoose.Schema({
  field1: String,
  field2: Field2Schema
});

1
被踩了。这可以在单个集合的模式中完成,这正是 OP 想要的。 - EnKrypt
@EnKrypt:请提供一个合适的答案。 - Sunny Milenov
哎呀,看起来我对这个答案不完全正确的判断是错误的,但这仍然不是一个最优的解决方案。没有必要定义嵌套模式并像这样将它们拼凑在一起。在更长的模式中,不仅会让串联变得难以维护,而且比在同一位置为每个子对象定义模式更慢。奥卡姆剃刀原理适用于此。 - EnKrypt
我已经编辑了答案以反映更简单、更好的解决方案,但由于我没有所需的声望,我需要等待编辑被批准后,SO才会允许我取消我的踩。谢谢你帮我修正错误,说实话,我感到相当尴尬。 - EnKrypt

0

如何将这个架构的数据插入到数据库中...主要是那些嵌套的字段...employee.namefirst = req.body.namefirst;

//first = req.body.namefirst;
employee.name.middle = req.body.namemiddle;
employee.name.last = req.body.namelast; 

姓名: { 名: { 类型: 字符串, 必填: 是 }, 中间名: { 类型: 字符串, 必填: 否 }, 姓: { 类型: 字符串, 必填: 是 } }.. 这是我的模式定义.. 如何插入 - learnNcode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接