Mongoose 验证子文档数组

Posted

技术标签:

【中文标题】Mongoose 验证子文档数组【英文标题】:Mongoose validate array of subdocuments 【发布时间】:2019-06-03 03:54:47 【问题描述】:

我有以下架构

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

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

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

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

【问题讨论】:

【参考方案1】:

我相信您不能为数组中正确类型的对象定义验证器,而只能在字段上。如果有办法按预期执行此操作,我很乐意收回我的答案!

但是:

您可以在字段上定义验证器并访问它所在的对象,如下所示:

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' 

【讨论】:

以上是关于Mongoose 验证子文档数组的主要内容,如果未能解决你的问题,请参考以下文章

发送多个子文档时,Mongoose 验证失败

发送多个子文档时,Mongoose 验证失败

Mongoose 删除数组中的子文档

Mongoose 中的子文档数组

在 Mongoose/MongoDB 的文档中过滤数组、子文档、数组、文档

Mongoose 填充子文档数组