有没有办法在mongoose架构中有条件地设置'required'字段?
示例:
if x==true, y's required=true. else y's required=false
答案 0 :(得分:3)
当然可以,使用mongoose的中间件。如果您需要某种形式的自定义验证,那么您可以将其连接到可用的挂钩中。一般验证发生在“预先保存”,因此有一个放置钩子的好地方。
作为一个完整的例子:
var async = require('async'),
mongoose = require('mongoose'),
Schema = mongoose.Schema;
mongoose.connect('mongodb://localhost/test');
var testSchema = new Schema({
x: Number,
y: Number
});
testSchema.pre('save', function(next) {
if ( this.x && !this.y ) {
return next(new Error("y is required when x is set"));
}
next();
});
var Test = mongoose.model("Test", testSchema, "test");
async.series(
[
function(callback) {
var test = new Test({ y: 1 });
test.save(function(err,test) {
if (err) {
console.log( err );
} else {
console.log("test1: ok");
}
console.log( "y only expected to work");
callback();
});
},
function(callback) {
var test = new Test({ x: 1 });
test.save(function(err,test) {
if (err) {
console.log( err );
} else {
console.log("test2: ok");
}
console.log("x only expected to fail");
callback();
});
},
function(callback) {
var test = new Test({ x: 1, y: 1});
test.save(function(err,test) {
if (err) {
console.log( err );
} else {
console.log("test3: ok");
}
console.log("x and y is fine");
callback();
});
}
]
);
因此,放置在模式定义上的钩子可以检查传入的字段的内容,并确定它们是否符合您定义的规则。在这种情况下,您正在寻找“y”的值,在定义“x”时始终存在。这意味着“y”本身很好,“x”和“y”一起符合规则,但“y”本身没有“x”会产生错误。
有关详细信息,请参阅文档中的middleware以及validation以实际验证为字段指定的值。