如何使用嵌套 "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
使其看起来与 error
: 相同
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
).
- 其次,我从上面尝试过相同的方法,只是代替
required
字段,我写道:default: null
这给了我一个错误 TypeError: Invalid value for schema path 'espData.default', got value "null"
.
那么,如何将 espData
定义为可选字段,它存在时必须具有 type
和 text
属性?
这是你想要的吗。创建一个包含所有验证的新文档架构,并将其嵌套在另一个带有 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
},
...
})
我的项目中有以下 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
使其看起来与error
: 相同
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
).
- 其次,我从上面尝试过相同的方法,只是代替
required
字段,我写道:default: null
这给了我一个错误TypeError: Invalid value for schema path 'espData.default', got value "null"
.
那么,如何将 espData
定义为可选字段,它存在时必须具有 type
和 text
属性?
这是你想要的吗。创建一个包含所有验证的新文档架构,并将其嵌套在另一个带有 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
},
...
})