The schema should be defined, so that an attribute b is required iff the attribute a is set to false.
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});
But if I define the schema as above, the validate call in the last line will throw an error that b is required, even if a is set to false:
ValidationError: Validation failed: b: Path `b` is required.
The problem thems to be, that this is not referring to the schema, but to the function and there is no value a defined, so the function will only evaluate to true and b is always required.
With Model.validate(), you need to pass the context as the third parameters to make it work correctly. Something like Model.validate({a: true}, ['b'], {a: true}) as mentioned in this issue. Or you can use Document.prototype.validate() instead:
let model = new Model({a: true});
model.validate();