У меня есть следующее определение схемы Mon goose в моем проекте:
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
становится необязательным полем, поскольку теперь у меня могут быть продукты, у которых нет этого свойства. Как я могу это сделать? Я попробовал пару вещей, но ни одна из них не сработала:
- Сначала я изменил
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
, а это не то, что я хотел (я хотел * 1035) *).
- Во-вторых, я попробовал то же самое сверху, вместо поля
required
, я написал: default: null
, который дал мне ошибку TypeError: Invalid value for schema path 'espData.default', got value "null"
.
Итак, как мне определить espData
как необязательное поле, которое должно иметь свойства type
и text
, если оно существует?