Предлагам да използвате този подход.
Трябва да имате отделни Schemas
за Account
, Teacher
и Student
така че различната информация между учители и ученици не трябва да се смесва на едно място.
Акаунт
var Account = new Schema({
email:String,
password:String,
_teacher:{type:Schema.Types.ObjectId, ref:'Teacher'},
_student:{type:Schema.Types.ObjectId, ref:'Student'}
})
Под акаунт трябва да се позовавате на модела на учителя, ако в противен случай акаунтът на учителя се позовава на модела на учениците.
За да проверите дали Account
е Teacher
или Student
можете просто да проверите _teacher
, ако има стойност, това е Teacher
акаунт иначе е студент. Но за да направите условието по-уникално, проверете и двете _teacher
и _student
.
Този подход ще ви спести много рефакторинг в бъдеще, ако решите да позволите на учителя да бъде и ученик (което не е невъзможно да се случи), той/тя може просто да използва същия акаунт и да се регистрира като ученик. Точно като това, което Google прави, в акаунт/имейл множество типове приложения за използване.
Учител
var Teacher = new Schema({
name:{type:Schema.Types.ObjectId, ref:'Name'}
// Other teachers info
})
Студент
var Student = new Schema({
name:{type:Schema.Types.ObjectId, ref:'Name'}
// Other students info
})
Име
В тази част може би се чудите защо имате нужда от отделен модел за име. Ами това е така, защото при този подход можете да използвате само един route
или endpoint
или query
за търсене на потребители в приложението ви. Когато търсите име, всички ученици и учители със съвпадащ резултат ще бъдат запитвани, без да се разглеждат 2 различни колекции (колекция от учители и колекция от ученици).
При добър случай на използване за това със сигурност ще имате табло за администратори, където можете да управлявате всички ученици и учители. В това табло можете да използвате само едно поле за търсене както за учител, така и за ученик.
var Name = new Schema({
firstName:String,
middleName:String,
lastName:String
})
Добро четене
Други съвети
Можете също да отделите Address
както направих с името тук. причина? Същата цел като с Name
, може да искате да добавите функция за търсене по местоположение или нещо подобно.
Надявам се това да помогне.