如何使用嵌套 "type" 属性 在 Mongoose 模式中定义非必填字段?

How to define non-required field in Mongoose schema with nested "type" property?

我的项目中有以下 Mongoose 模式定义:

export const ProductSchema: SchemaDefinition = {
  type: { type: String, enum: constants.productTypes, required: true },
  name: { type: String, required: false },

  espData: {
    type: { type: String, required: true },
    text: { type: String, required: true }
  },

  error: {
    type: {
      message: { type: String, required: true },
      statusCode: { type: Number, default: null }
    },
    required: false
  }
  // Some more definitions...
};

这里重要的是我有一系列产品,其中每个产品都有自己的 type(这是一个必需的字符串 属性,可以在 constants.productTypes 中定义值) ,一个非必需的 name 字段等等。此外,espData 字段有自己的强制性 type 属性,这与顶级 type 完全不同。而且,有 error 属性 不是一直存在的,但是当它存在时,它必须有 message 属性 和可选的 statusCode 属性.

我现在必须修改此架构,以便 espData 成为可选字段,因为我现在可能拥有没有此 属性 的产品。我怎么做?我尝试了几件事,但 none 成功了:

  espData: {
    type: {
      type: { type: String, required: true },
      text: { type: String, required: true }
    },
    required: false
  },

但是,这不起作用,很可能是因为有太多嵌套的 type 属性。有趣的是,它完全适用于 error 属性,它具有与 espData 相同的结构,但没有嵌套 type 属性。我使用的代码是

    const model = new this.factories.product.model();
    model.type = 'hi-iq';
    // model.espData purposely left undefined
    await model.save();

我得到的错误是 Product validation failed: espData.type.text: Path 'espData.type.text' is required., espData.type.type: Path 'espData.type.type' is required. 这表明从模式创建的 model 被创建为 espData.type.type 这不是我想要的(我想要 espData.type ).

那么,如何将 espData 定义为可选字段,它存在时必须具有 typetext 属性?

这是你想要的吗。创建一个包含所有验证的新文档架构,并将其嵌套在另一个带有 required: false 的架构中(无论如何默认为 false)

const EspDataSchema = new Schema({
  type: { type: String, required: true },
  text: { type: String, required: true },
},
  {
    _id: false,
  }

);

示例


export const ProductSchema = new Schema({

...
   espData: {
    type: EspDataSchema,
    required: false
   },

...

})