2012-04-27 17 views
19

Dato il seguente schema:Mangusta: come impostare un campo schema come ID?

var UserSchema = new Schema({ 
    , email : { type: String } 
    , passwordHash : { type: String } 
    , roles : { type: [String] } 
}); 

mi piacerebbe email essere la chiave. Come posso definirlo?

che potevo fare:

var UserSchema = new Schema({ 
     , _id: { type: String } 
     , passwordHash : { type: String } 
     , roles : { type: [String] } 
    }); 

così MongoDB sarebbe riconoscere come l'id-campo, e adattare il mio codice per fare riferimento a _id invece di email, ma che non si sente pulito per me.

Chiunque?

+7

penso che tu sia meglio lasciare _id come ObjectID e fare e-mail un indice univoco. – JohnnyHK

+0

È questo il consenso generale? Avere ID di dominio come Unico e lasciare che MongoDB si occupi degli Id tecnici? –

+0

Dato che stai usando Mongoose, un'altra opzione sarebbe quella di utilizzare la stringa email come campo _id e quindi aggiungere un [campo virtuale] (http://mongoosejs.com/docs/virtuals.html) denominato "email" che ha restituito _id per pulire il codice che utilizza l'e-mail. – JohnnyHK

risposta

32

Dal momento che si sta utilizzando Mongoose, una possibilità è quella di utilizzare la stringa di posta elettronica come il campo _id e quindi aggiungere un nome virtual fieldemail che restituisce il _id per ripulire il codice che utilizza l'e-mail.

var userSchema = new Schema({ 
    _id: {type: String}, 
    passwordHash: {type: String}, 
    roles: {type: [String]} 
}); 

userSchema.virtual('email').get(function() { 
    return this._id; 
}); 

var User = mongoose.model('User', userSchema); 

User.findOne(function(err, doc) { 
    console.log(doc.email); 
}); 

Nota che un campo virtuale non è incluso di default quando si converte un documento Mangusta a un oggetto JS normale o stringa JSON. Per includerlo è necessario impostare l'opzione virtuals: true nella chiamata toObject() o toJSON():

var obj = doc.toObject({ virtuals: true }); 
var json = doc.toJSON({ virtuals: true }); 
+1

Potresti mostrare come apparirà il codice operativo usando la tua soluzione? –

+1

@ZackS Buona idea - aggiunta. – JohnnyHK

+0

Per rendere la risposta più completa, ho aggiunto ulteriori dettagli sui campi virtuali - sembra essere una domanda comune. –

Problemi correlati