猫鼬验证子文档数组

时间:2019-01-08 12:44:50

标签: mongodb validation mongoose mongoose-schema

我有以下模式

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

我想为每个上下文添加一个验证,以确保设置了字段或通道。

我尝试将上下文提取到单独的架构并设置如下所示的验证,但它仅验证整个数组,而不是每个上下文。

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

1 个答案:

答案 0 :(得分:0)

我相信您不能为数组中正确键入的对象定义验证器,而只能在字段上定义。如果可以按照预期方式进行操作,我将很高兴收回我的答案!

但是:

您可以在字段上定义验证器,并像这样访问其所在的对象:

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' }

这具有以下缺点:验证器在数组的每个字段上运行。如果仅同时设置它们,则只能将其设置为一个字段。

或者: 但是,如果不需要定义数组中对象的类型,则只需将数组对象的类型设置为“混合”,然后在此字段上定义验证器即可。

 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' }