2013-03-04 2 views
0

Например, у меня есть пользовательская схема, и я хочу подтвердить, что имя пользователя уникально, даже если вы пытаетесь сохранить пользователя в базе данных.Может ли схема использовать свою собственную модель для проверки?

... 

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(...), но это только кажется немного глупым, там нет лучшего способа сделать это?

ответ

1

Вы можете создать уникальный индекс в своей схеме, установив 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

+1

Вы можете создавать составные индексы для выполнения нескольких уникальных валидаций полей следующим образом: 'Schema.index ({имя пользователя: 1, accountCode: 1}, {unique: true})' Однако он бросает MongoError, а не a ValidationError – matthewtole

+0

Да, это моя проблема, я уже создал составной индекс на Схеме, но я думаю, что у меня есть преимущество в проверке того, что до сохранения нет дублированной записи. – Siyfion

Смежные вопросы