在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值,我们可以定义一个函数hasCarhasCarrequired

 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 }