我正在使用Monggose 4.8.1。我有一个简单的架构:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var Organisation = new mongoose.Schema({
name: {
type: String,
required: [true, 'Organisation name must be provided'],
unique: [true, 'Organisation name must be unique']
},
createdBy: {
type: String,
ref: 'User'
},
createdOn: {
type: Date,
"default": Date.now
},
availableUntil: {
type: Date
}
});
mongoose.model('Organisation', Organisation);
我已将电子邮件email@domain.com保存在文档中。
现在我想尝试再次保存它,首先使用validateAsync
检查它是否有效。所以我希望收到错误,因为电子邮件不是唯一的。
var organisation = new Organisation({
name: 'email@domain.com'
});
var validResult = organisation.validateSync();
console.log('validResult is ', validResult);
但是validResult总是undefined
...
修改
我在架构中添加了一个额外的属性:
eggs: {
type: Number,
min: [6, 'Too few eggs'],
max: 12
}
然后尝试保存eggs: 3
,这就产生了错误。奇怪的是,即使在模式中设置,mongoose验证似乎也不会检查值是否唯一...
答案 0 :(得分:1)
对于此类验证,您可以使用path
和validate
来完成此过程。
var OrganisationSchema = new mongoose.Schema({
name: {
type: String,
required: [true, 'Organisation name must be provided']
}
//....
});
OrganisationSchema.path('name').validate(function(value, done){
var self = this;
if(!self.isNew){
return done(true);
}else{
//mongoose.models['Organisation'] or self.model('Organisation')
mongoose.models['Organisation'].count({name: value}, function(err, count){
if(err){
return done(err);
}
return done(!count)
});
}
}, "This email already exists" );
mongoose.model('Organisation', OrganisationSchema);
答案 1 :(得分:0)
标记。
您是否可以验证mongodb是否包含已保存型号的记录:db.organisations.find()
?
看起来如果您有undefined
值,则表示文档已按照validateSync()
的文档通过了验证步骤:
var err = doc.validateSync();
if ( err ){
handleError( err );
} else {
// validation passed
}