猫鼬验证子文档数组
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' }
我有以下架构
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' }