Ich schlage vor, diesen Ansatz zu verwenden.
Sie sollten separate Schemas
haben für Account
, Teacher
und Student
Daher sollten die unterschiedlichen Informationen zwischen Lehrern und Schülern nicht an einem Ort gemischt werden.
Konto
var Account = new Schema({
email:String,
password:String,
_teacher:{type:Schema.Types.ObjectId, ref:'Teacher'},
_student:{type:Schema.Types.ObjectId, ref:'Student'}
})
Unter Konto sollten Sie auf das Lehrermodell verweisen, wenn das Lehrerkonto andernfalls auf das Schülermodell verweist.
Um zu überprüfen, ob Account
ist Teacher
oder Student
Sie könnten einfach _teacher
überprüfen , wenn es einen Wert hat, dann ist es ein Teacher
Konto sonst ist es ein Student. Aber um die Bedingung für Sie einzigartiger zu machen, überprüfen Sie beide _teacher
und _student
.
Dieser Ansatz erspart Ihnen in Zukunft eine Menge Refactoring, wenn Sie sich entscheiden, dem Lehrer zu erlauben, auch ein Schüler zu sein (was nicht unmöglich ist), kann er/sie einfach dasselbe Konto verwenden und sich als Schüler registrieren. Genau wie Google es tut, auf Rechnung/E-Mail mehrere Arten von Apps zu verwenden.
Lehrer
var Teacher = new Schema({
name:{type:Schema.Types.ObjectId, ref:'Name'}
// Other teachers info
})
Schüler
var Student = new Schema({
name:{type:Schema.Types.ObjectId, ref:'Name'}
// Other students info
})
Name
In diesem Teil fragen Sie sich vielleicht, warum Sie ein separates Modell für den Namen benötigen. Nun, das liegt daran, dass Sie bei diesem Ansatz nur eine route
verwenden können oder endpoint
oder query
um Benutzer in Ihrer App zu suchen. Wenn Sie nach einem Namen suchen, werden alle Schüler und Lehrer mit übereinstimmenden Ergebnissen abgefragt, ohne dass in 2 verschiedenen Sammlungen (Lehrersammlung und Schülersammlung) nachgesehen wird.
Ein guter Anwendungsfall dafür ist, dass Sie mit Sicherheit ein Admin-Dashboard haben, in dem Sie alle Schüler und Lehrer verwalten können. In diesem Dashboard können Sie nur ein Suchfeld für Lehrer und Schüler verwenden.
var Name = new Schema({
firstName:String,
middleName:String,
lastName:String
})
Gute Lektüre
Weitere Tipps
Sie können die Address
auch trennen wie ich es mit dem Namen hier getan habe. Grund? Gleicher Zweck wie beim Name
, möchten Sie vielleicht die Funktion „Suche nach Standort“ oder ähnliches hinzufügen.
Ich hoffe, das hilft.