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.