我有模型,其中car属性是可选的,但是汽车嵌套文档中有一些属性,如果User有汽车,如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
},
}
})
答案 0 :(得分:1)
如果default
没有carType
值,我们可以将hasCar
的{{1}}函数定义为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: '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 }
的{{1}}值为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();
});