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 }) 
+0

我的例子是有所简化;实际上,我有两个属性,在组合时需要是唯一的。一个'username'和一个'accountCode',这样一个用户名在它绑定的帐户上是唯一的。另外,你描述的方法会返回一个'ValidationError'吗?或者是一个'MongoError'? – Siyfion 2013-03-04 11:31:52

+1

您可以创建复合索引做多个领域具有独特的验证这样的: 'Schema.index({用户名:1​​,accountCode:1},{独特:真正})' 但它确实抛出一个MongoError,而不是a ValidationError – matthewtole 2013-03-04 11:47:07

+0

是的,这是我的问题,我已经在Schema上创建了一个复合索引,但我认为验证在保存之前没有重复条目是有好处的。 – Siyfion 2013-03-04 12:34:04