2014-04-29 17 views
6

Sto studiando Mongodb e sto usando Mongoose e mi piacerebbe creare un processo di registrazione molto dinamico. Ho gestito il primo passaggio della registrazione utilizzando Passport e tutto funziona correttamente, ho creato l'utente ed è presente sul DB. Ora il mio processo di registrazione continuerà e l'utente deve selezionare un "ruolo": che tipo di utente sei? Ci sono 2 opzioni: "base" e "avanzato". Di base ha solo 3 proprietà e avanzato ha le 3 proprietà di base più poche altre.Rapporto manganese

Ho bisogno di estendere il userSchema o per aggiungere nuovi campi in base a tale ruolo, ma dopo una settimana non funziona ancora e ho provato molti NPM come: mangusta-relazione o mangusta-schema-estendere.

Questo è fondamentalmente ciò che ho:

userSchema = new Schema({ 
    id   : Number, 
    email  : { type: String, required: true }, 
    role   : { type: String, required: true }, 
    profile  : { ... } // Profile fields are different for each role. 
}); 

// profile 1 
basicSchema = new Schema({ 
    info1  : { type: String, required: true }, 
    info2  : { type: String, required: true }, 
    info3  : { type: String, required: true } 
}); 

// profile 2 
advancedSchema = new Schema({ 
    info1  : { type: String, required: true }, 
    info2  : { type: String, required: true }, 
    info3  : { type: String, required: true }, 
    info4  : { type: String, required: true }, 
    info5  : { type: String, required: true }, 
    info6  : { type: String, required: true } 
}); 

L'utente esiste già e lui è su una schermata in cui ha bisogno di scegliere un ruolo e popolare il profilo scelto.

Per informazioni sto usando nodejs e expressjs.

Spero che tu possa aiutare. Grazie.

+0

Ha profilo dell'oggetto dell'utente deve esiste al di fuori dell'oggetto utente? O lo recupererai sempre insieme all'oggetto User? – Andy

risposta

3

Utilizzando mangusta-schema-estendono:

Installare via NPM: $ npm install mongoose-schema-extend

esempio utilizzando il codice:

var mongoose = require('mongoose'), 
    extend = require('mongoose-schema-extend'); 
var Schema = mongoose.Schema; 

var userSchema = new Schema({ 
    id   : Number, 
    email  : { type: String, required: true }, 
    role   : { type: String, required: true }, 
},{ collection : 'users' }); 

//profile 1 
var basicSchema = userSchema.extend({ 
    info1  : { type: String, required: true }, 
    info2  : { type: String, required: true }, 
    info3  : { type: String, required: true } 
}); 

//profile 2 
var advancedSchema = userSchema.extend({ 
    info1  : { type: String, required: true }, 
    info2  : { type: String, required: true }, 
    info3  : { type: String, required: true }, 
    info4  : { type: String, required: true }, 
    info5  : { type: String, required: true }, 
    info6  : { type: String, required: true } 
}); 

mongoose-schema-extend

+0

Grazie per la risposta, ma non funziona se un utente esiste già. –

2

Questo è quello che vuoi. Il concetto di "eredità" e campo discriminatorio. Dagli Un colpo. L'ho usato e fa miracoli. Fondamentalmente hai 3 tipi di utenti: base, avanzato ed esperto. Ognuno si basa sul modello core/base e quindi si estende con le proprietà aggiuntive necessarie, definendo un'eredità per ruolo.

Questo ti dà un sacco di vantaggi, principalmente: mangusta popoleranno il modello appropriato e calci alcuna convalida si ha nei modelli derivati, ecc

https://github.com/briankircho/mongoose-schema-extend

+0

Ciao @Biba, sembra buono e sto provando qualcosa ma ancora non ha avuto successo ... puoi per favore fornire un esempio sull'utilizzo senza id ma con una chiave specifica: valore? Saluti. –

+0

L'esempio migliore è proprio qui: https://github.com/briankircho/mongoose-schema-extend. Leggi la sezione chiamata Chiave Discriminatoria. Usa il concetto lì per applicare i tuoi 3 ruoli che vuoi implementare. – Biba

+0

Il problema, dopo molti tentativi, è che ho già creato l'utente e quando scelgo il ruolo e cerco di creare una nuova istanza di quel ruolo non funziona. Devo estendere un utente esistente, non creare un nuovo utente con tutte le proprietà ... –