Как создать собственный валидатор, который делает поле MongoDB обязательным, если другое поле имеет определенное значение? - PullRequest
0 голосов
/ 02 апреля 2020

Я использую MongoDB и Пн goose.

Предположим, у меня есть следующая схема.

const notificationMetaSchema = new mongoose.Schema({
    listingId: { type: mongoose.Schema.Types.ObjectId },
});

const notificationSchema = new mongoose.Schema({
    category: { type: String, required: true, enum: [ "categoryA", "categoryB" ] },
    meta: notificationMetaSchema,
});

Я хочу, чтобы мое поле "перечисление" требовалось только тогда, когда "категория" "field is" categoryA ".

Эта проверка в идеале существует как при создании документа, так и при его обновлении.

Как создать собственный валидатор для достижения этого эффекта?

РЕДАКТИРОВАТЬ

Я попробовал следующее:

const notificationSchema = new mongoose.Schema({
    category: { type: String, required: true, enum: [ "categoryA", "categoryB" ] },
    meta: {
        listingId: {
            type: mongoose.Schema.Types.ObjectId,
            required: function () {
                return [
                    "categoryA",
                ].includes(this.category);
            }
        },
    },
});

Однако, когда я вызываю следующий запрос:

Notification.findOneAndUpdate({}, $set: { category: "categoryA", meta: {} }).exec();

Ошибка проверки отсутствует

1 Ответ

1 голос
/ 02 апреля 2020

Вы можете написать javaScript функцию для поля в схеме mon goose, эта функция может действовать как пользовательский валидатор, Ваша схема должна выглядеть следующим образом:

const notificationSchema = new mongoose.Schema({
  category: {
    type: String,
    required: true,
    enum: ["categoryA", "categoryB"]
  },
  meta: {
    listingId: {
      type: mongoose.Schema.Types.ObjectId,
      required: function checkRequiredOrNot() {
        /** This function returns true or false, 'this.category' will retrieve current object's 'category' value */
        return this.category == "categoryA" ? true : false;
      }
    }
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...