Mongoose проверяет массив вложенных документов - PullRequest
0 голосов
/ 08 января 2019

У меня есть следующая схема

const TextSchema = new Schema({
  locale: String,
  contexts: [{
    field: String,
    channel: String,
  }],
});

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

Я попытался извлечь контекст в отдельную схему и установить валидацию, как показано ниже, но он проверяет только весь массив вместо каждого контекста.

const TextSchema = new Schema({
  locale: String,
  contexts: {
    type: [ContextSchema],
    validate: validateContext,
  },
});

1 Ответ

0 голосов
/ 08 января 2019

Я считаю, что вы не можете определить валидатор для правильно типизированного объекта в массиве, но только для полей. Если есть способ сделать это, как ожидалось, я был бы рад отозвать мой ответ!

Тем не менее:

Вы МОЖЕТЕ определить валидатор для поля и получить доступ к объекту, в котором он находился, следующим образом:

const validator = function(theField) {
    console.log('The array field', theField);
    console.log('The array object', this);
    return true;
};

const TextSchema = new Schema({
    locale: String,
    contexts: [{
      field: {
        type: String,
        validate: validator
      },
      channel: {
        type: String,
        validate: validator,
      },
    }],
});

Печатает что-то вроде

The array field FIELDVALUE
The array object { _id: 5c34a4172a0f34220d17fc1f, field: '21', channel: '2123' }

Это имеет тот недостаток, что валидатор работает с каждым полем в массиве. Если вы устанавливаете их одновременно, вы можете установить их только для одного поля.

В качестве альтернативы: Однако если вам не нужно определять типы объектов в массиве, вы можете просто установить тип объектов массива на Mixed и определить валидатор для этого поля.

 const TextSchema = new Schema({
    locale: String,
    contexts: [{
      type: mongoose.SchemaTypes.Mixed, 
      validate : function (val) {
       console.log(val);
       return true;
      },
    }],
});

Следует также напечатать

{ _id: 5c34a4172a0f34220d17fc1f, field: '21', channel: '2123' }
...