Sugiero usar este enfoque.
Deberías tener un Schemas
separado para Account
, Teacher
y Student
por lo tanto, la información diferente entre los profesores y los estudiantes no debe mezclarse en un solo lugar.
Cuenta
var Account = new Schema({
email:String,
password:String,
_teacher:{type:Schema.Types.ObjectId, ref:'Teacher'},
_student:{type:Schema.Types.ObjectId, ref:'Student'}
})
En la cuenta, debe hacer referencia al modelo del profesor si la cuenta del profesor hace referencia al modelo de los alumnos.
Para verificar si Account
es Teacher
o Student
podrías comprobar _teacher
, si tiene un valor entonces es un Teacher
cuenta de lo contrario es un estudiante. Pero para que la condición sea más única para usted, marque ambos _teacher
y _student
.
Este enfoque le ahorrará una gran cantidad de refactorización en el futuro si decide permitir que el maestro también sea un estudiante (lo cual no es imposible), él / ella puede usar la misma cuenta y registrarse como estudiante. Al igual que lo que está haciendo Google, en la cuenta/correo electrónico hay varios tipos de aplicaciones para usar.
Profesor
var Teacher = new Schema({
name:{type:Schema.Types.ObjectId, ref:'Name'}
// Other teachers info
})
Estudiante
var Student = new Schema({
name:{type:Schema.Types.ObjectId, ref:'Name'}
// Other students info
})
Nombre
En esta parte, tal vez se esté preguntando por qué necesita un modelo separado para el nombre. Bueno, eso se debe a que en este enfoque solo puede usar una route
o endpoint
o query
para buscar usuarios en su aplicación. Cuando busque un nombre, todos los estudiantes y profesores con resultados coincidentes serán consultados sin buscar en 2 colecciones diferentes (Colección de profesores y Colección de estudiantes).
Un buen caso de uso para esto es, seguro que tendrá un panel de administración donde podrá administrar a todos los estudiantes y profesores. En ese tablero, puede usar un solo campo de búsqueda tanto para el maestro como para el estudiante.
var Name = new Schema({
firstName:String,
middleName:String,
lastName:String
})
Buenas lecturas
Otros consejos
También puede separar la Address
como hice con el nombre aquí. ¿Razón? Mismo propósito que con el Name
, es posible que desee agregar la función de búsqueda por ubicación o algo así.
Espero que esto ayude.