Sugiro usar essa abordagem.
Você deve ter um
Schemas
separado para Account
, Teacher
e Student
portanto, as diferentes informações entre professores e alunos não devem ser misturadas em um só lugar. Conta
var Account = new Schema({
email:String,
password:String,
_teacher:{type:Schema.Types.ObjectId, ref:'Teacher'},
_student:{type:Schema.Types.ObjectId, ref:'Student'}
})
Em conta, você deve fazer referência ao modelo Professor se a conta do professor fizer referência ao modelo Alunos.
Para verificar se
Account
é Teacher
ou Student
você pode apenas verificar _teacher
, se tiver um valor, então é um Teacher
conta senão é um estudante. Mas para tornar a condição mais exclusiva para você, verifique tanto _teacher
e _student
. Essa abordagem economizará muita refatoração no futuro se você decidir permitir que o professor seja um aluno também (o que não é impossível de acontecer), ele pode simplesmente usar a mesma conta e se registrar como aluno. Assim como o google está fazendo, na conta/e-mail vários tipos de aplicativo para usar.
Professor
var Teacher = new Schema({
name:{type:Schema.Types.ObjectId, ref:'Name'}
// Other teachers info
})
Aluno
var Student = new Schema({
name:{type:Schema.Types.ObjectId, ref:'Name'}
// Other students info
})
Nome
Nesta parte, talvez você esteja se perguntando por que precisa de um modelo separado para o nome. Bem, isso é porque nesta abordagem você pode usar apenas uma
route
ou endpoint
ou query
para pesquisar usuários em seu aplicativo. Ao pesquisar um nome, todos os alunos e professores com resultados correspondentes serão consultados sem examinar 2 coleções diferentes (coleção de professores e coleção de alunos). Um bom caso de uso para isso é, com certeza, você terá um painel de administração onde poderá gerenciar todos os alunos e professores. Nesse painel, você pode apenas um campo de pesquisa para professor e aluno.
var Name = new Schema({
firstName:String,
middleName:String,
lastName:String
})
Boas leituras
Outras dicas
Você também pode separar o
Address
como eu fiz com o nome aqui. Razão? Mesma finalidade do Name
, talvez você queira adicionar o recurso de pesquisa por local ou algo parecido. Eu espero que isso ajude.