MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

modelo mangusto para vários tipos de usuários


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.