簡體   English   中英

Mongoose 驗證子文檔數組

[英]Mongoose validate array of subdocuments

我有以下架構

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

我想為每個上下文添加一個驗證,以確保設置了字段或通道。

我嘗試將上下文提取到單獨的模式並設置如下驗證,但它只驗證整個數組而不是每個上下文。

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

我相信您不能為數組中正確類型的對象定義驗證器,而只能在字段上定義。 如果有辦法按預期執行此操作,我很樂意收回我的答案!

然而:

你可以在一個字段上定義一個驗證器並像這樣訪問它所在的對象:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM