应定义模式,以便当属性
b
设置为 false 时需要属性 a
。
const { Schema, model } = require("mongoose");
const schema = new Schema({
a: { type: Boolean, default: false },
b: {
type: Number,
required: function () {
return !this.a;
}
}
});
const Model = model("bla", schema);
Model.validate({a: true});
但是,如果我按照上面的方式定义模式,最后一行中的验证调用将引发需要
b
的错误,即使 a
设置为 false
:
ValidationError: Validation failed: b: Path `b` is required.
问题在于,这不是指模式,而是指函数,并且没有定义值
a
,因此该函数只会评估为true
,并且始终需要b。
使用
Model.validate()
,您需要将上下文作为第三个参数传递以使其正常工作。类似本issue中提到的
Model.validate({a: true}, ['b'], {a: true})
。或者您可以使用 Document.prototype.validate()
代替:
let model = new Model({a: true});
model.validate();
可以在模式对象上声明
$cond
属性并具有 if
和 else
语句。
示例:
b: {
type: String,
$cond: {
if: { $eq: ["$a", false] },
then: { required: true },
else: { required: false },
},
}
根据注册方法,我必须将其用于密码字段。希望这有帮助!