Как определить необязательное поле в схеме Mon goose с вложенным свойством type? - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть следующее определение схемы 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, если оно существует?

1 Ответ

1 голос
/ 05 февраля 2020

Это то, что вы хотите. Создайте новую Схему Документа со всеми проверками и вложите ее в другую Схему с 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
   },

...

})
...