在Mongoose中dynamicvalidation
我有模型,汽车属性是可选的,但汽车嵌套文件中有一些属性,如果用户有汽车,就像cartype : {required: true}
,但汽车被定义时,应该要求。
var UserSchema = new Schema({ email: { type: 'String', required: true }, car: { carType: { // should be required if user have car type: 'Number', default: TransportType.Car }, } })
如果hasCar
没有default
值,我们可以定义一个函数hasCar
为hasCar
所required
的
var UserSchema = new Schema({ email: { type: 'String', required: true }, car: { carType: { type: 'Number', required: hasCar, //default: TransportType.Car }, } }); function hasCar() { return JSON.stringify(this.car) !== JSON.stringify({});//this.car; && Object.keys(this.car).length > 0; }
用testing代码
var u1 = new UUU({ email: 'test.user1@email.com' }); u1.save(function(err) { if (err) console.log(err); else console.log('save u1 successfully'); }); var u2 = new UUU({ email: 'test.user1@email.com', car: {carType: 23} }); u2.save(function(err) { if (err) console.log(err); else console.log('save u2 successfully'); });
结果:
{ "_id" : ObjectId("56db9d21d3fb99340bcd113c"), "email" : "test.user1@email.com", "__v" : 0 } { "_id" : ObjectId("56db9d21d3fb99340bcd113d"), "email" : "test.user1@email.com", "car" : { "carType" : 23 }, "__v" : 0 }
但是,如果有carType
default
值,这里可能是一个解决方法
var UserSchema = new Schema({ email: { type: 'String', required: true }, car: { carType: { type: 'Number', required: hasCar, default: 1 }, } }); function hasCar() { if (JSON.stringify(this.car) === JSON.stringify({carType: 1})) { this.car = {}; } return JSON.stringify(this.car) === JSON.stringify({}); } UserSchema.pre('save', function(next){ // if there is only default value of car, just remove this default carType from car if (JSON.stringify(this.car) === JSON.stringify({carType: 1})) { delete this.car; } next(); });
用上面的testing代码,结果是
{ "_id" : ObjectId("56db9f73df8599420b7d258a"), "email" : "test.user1@email.com", "car" : null, "__v" : 0 } { "_id" : ObjectId("56db9f73df8599420b7d258b"), "email" : "test.user1@email.com", "car" : { "carType" : 23 }, "__v" : 0 }