Proponuję skorzystać z tego podejścia.
Powinieneś mieć oddzielne Schemas dla Account , Teacher i Student więc różne informacje między nauczycielami i uczniami nie powinny być mieszane w jednym miejscu.
Konto
var Account = new Schema({
email:String,
password:String,
_teacher:{type:Schema.Types.ObjectId, ref:'Teacher'},
_student:{type:Schema.Types.ObjectId, ref:'Student'}
})
W ramach konta należy odwoływać się do modelu Nauczyciela, jeśli konto nauczyciela w inny sposób odwołuje się do modelu Uczniów.
Aby sprawdzić, czy Account jest Teacher lub Student możesz po prostu sprawdzić _teacher , jeśli ma wartość, to jest Teacher konto inaczej to student. Ale aby warunek był bardziej unikalny, sprawdź oba _teacher i _student .
Takie podejście zaoszczędzi ci wielu refaktoryzacji w przyszłości, jeśli zdecydujesz się pozwolić nauczycielowi być również uczniem (co nie jest niemożliwe), może on po prostu użyć tego samego konta i zarejestrować się jako uczeń. Podobnie jak to, co robi Google, na koncie / e-mailu można używać wielu typów aplikacji.
Nauczyciel
var Teacher = new Schema({
name:{type:Schema.Types.ObjectId, ref:'Name'}
// Other teachers info
})
Student
var Student = new Schema({
name:{type:Schema.Types.ObjectId, ref:'Name'}
// Other students info
})
Nazwa
Być może w tej części zastanawiasz się, dlaczego potrzebujesz osobnego modelu na nazwę. Cóż, to dlatego, że w tym podejściu możesz użyć tylko jednej route lub endpoint lub query do wyszukiwania użytkowników w Twojej aplikacji. Podczas wyszukiwania imienia i nazwiska wszyscy uczniowie i nauczyciele z pasującymi wynikami zostaną zapytani bez przeszukiwania 2 różnych kolekcji (kolekcji nauczycieli i kolekcji uczniów).
W dobrym przypadku jest to, że na pewno będziesz miał pulpit administratora, w którym możesz zarządzać wszystkimi uczniami i nauczycielami. W tym panelu możesz tylko jedno pole wyszukiwania dla nauczyciela i ucznia.
var Name = new Schema({
firstName:String,
middleName:String,
lastName:String
})
Dobre lektury
Inne wskazówki
Możesz także oddzielić Address tak jak ja z nazwą tutaj. Powód? Taki sam cel jak w przypadku Name , możesz dodać funkcję wyszukiwania według lokalizacji lub coś podobnego.
Mam nadzieję, że to pomoże.