我有一个模型,其中car属性是可选的,但是car嵌套文档中有一些属性,如果用户有car,例如cartype : {required: true}
,但是在定义car时,这是必需的。
var UserSchema = new Schema({
email: {
type: 'String',
required: true
},
car: {
carType: {
// should be required if user have car
type: 'Number',
default: TransportType.Car
},
}
})
最佳答案
如果default
没有carType
值,则可以如下定义一个函数hasCar
到required
的carType
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;
}
带有测试代码
var u1 = new UUU({
email: '[email protected]'
});
u1.save(function(err) {
if (err)
console.log(err);
else
console.log('save u1 successfully');
});
var u2 = new UUU({
email: '[email protected]',
car: {carType: 23}
});
u2.save(function(err) {
if (err)
console.log(err);
else
console.log('save u2 successfully');
});
结果:
{ "_id" : ObjectId("56db9d21d3fb99340bcd113c"), "email" : "[email protected]", "__v" : 0 }
{ "_id" : ObjectId("56db9d21d3fb99340bcd113d"), "email" : "[email protected]", "car" : { "carType" : 23 }, "__v" : 0 }
但是,如果
default
的值为carType
,则这里可能是一种解决方法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();
});
使用以上测试代码,结果是
{ "_id" : ObjectId("56db9f73df8599420b7d258a"), "email" : "[email protected]", "car" : null, "__v" : 0 }
{ "_id" : ObjectId("56db9f73df8599420b7d258b"), "email" : "[email protected]", "car" : { "carType" : 23 }, "__v" : 0 }