sql >> Database teknologi >  >> NoSQL >> MongoDB

mongoose model til multi-type brugere

Jeg foreslår, at du bruger denne tilgang.

Du bør have et separat Schemas for Account , Teacher og Student så de forskellige oplysninger mellem lærere og elever bør ikke blandes ét sted.

Konto

var Account = new Schema({
    email:String,
    password:String,
    _teacher:{type:Schema.Types.ObjectId, ref:'Teacher'},
    _student:{type:Schema.Types.ObjectId, ref:'Student'}
})

Under konto skal du referere til lærermodellen, hvis lærerkontoen ellers refererer til elevmodellen.

For at kontrollere, om Account er Teacher eller Student du kunne bare tjekke _teacher , hvis det har en værdi, så er det en Teacher konto ellers er det en studerende. Men for at gøre tilstanden mere unik for dig, tjek begge _teacher og _student .

Denne tilgang vil spare dig for en masse refaktorering i fremtiden, hvis du beslutter dig for også at give læreren lov til at være elev (hvilket ikke er umuligt), han/hun kan bare bruge den samme konto og registrere sig som elev. Ligesom hvad google gør, på konto/e-mail flere typer app at bruge.

Lærer

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
})

Navn

På denne del undrer du dig måske over, hvorfor du har brug for en separat model til navnet. Nå, det er fordi i denne tilgang kan du bare bruge én route eller endpoint eller query at søge efter brugere på tværs af din app. Når du søger efter et navn, vil alle elever og lærere med matchende resultater blive forespurgt uden at se på 2 forskellige samlinger (Lærersamling og Elevsamling).

Et godt eksempel på dette er, at du helt sikkert vil have et admin-dashboard, hvor du kan administrere alle elever og lærere. I det dashboard kan du kun ét søgefelt for både lærer og elev.

var Name = new Schema({
    firstName:String,
    middleName:String,
    lastName:String
})

God læsning

Andre tips

Du kan også adskille Address som jeg gjorde med navnet her. Grund? Samme formål som med Name , vil du måske tilføje søgning efter placering eller noget lignende.

Jeg håber, at dette hjælper.



  1. Bursts af RedisTimeoutException ved hjælp af StackExchange.Redis

  2. Hvordan kan jeg bruge mongodump til at dumpe poster, der matcher et bestemt datointerval?

  3. sql 'like' operationer på tal i mongodb

  4. Hvordan vendes en afviklingssammenlægning?