Schema可以使用它自己的模型进行验证吗?
问题描述:
例如,假设我有一个用户架构,并且我想在尝试将用户保存到数据库之前验证用户名是唯一的。Schema可以使用它自己的模型进行验证吗?
...
UserSchema.path('username')
.validate(function (value, respond) {
User.findOne({ username: this.username }) // This isn't valid.
.lean()
.select('_id')
.exec(function (err, user) {
if (err) {
winston.warn('User_username: Error looking for duplicate users');
respond(false);
}
// If a user was returned, then the user is non-unique!
if (user) {
respond(false);
}
respond(true);
});
});
...
var User = mongoose.model('User', UserSchema);
我知道我可以使用mongoose.model('User').findOne(...)
但只是似乎有点傻,有没有更好的办法来做到这一点?
答
您可以通过设置unique: true
在您的架构中创建唯一索引。这将使用mongodb中唯一的索引选项。下面是使用该选项从我的模型的一个例子片段:从意见
// The (generated) uniform resource locator
url: {
// ... which is required ...
required: true,
// ... which is an unique index ...
unique: true,
// ... and is a string.
type: String
}
复合键:
Schema.index({ username: 1, accountCode: 1 }, { unique: true })
我的例子是有所简化;实际上,我有两个属性,在组合时需要是唯一的。一个'username'和一个'accountCode',这样一个用户名在它绑定的帐户上是唯一的。另外,你描述的方法会返回一个'ValidationError'吗?或者是一个'MongoError'? – Siyfion 2013-03-04 11:31:52
您可以创建复合索引做多个领域具有独特的验证这样的: 'Schema.index({用户名:1,accountCode:1},{独特:真正})' 但它确实抛出一个MongoError,而不是a ValidationError – matthewtole 2013-03-04 11:47:07
是的,这是我的问题,我已经在Schema上创建了一个复合索引,但我认为验证在保存之前没有重复条目是有好处的。 – Siyfion 2013-03-04 12:34:04