2012-04-27 6 views
19

Dado el siguiente esquema:Mangosta: ¿cómo establecer un campo de esquema para ser la identificación?

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

me gustaría email a ser la clave. ¿Cómo puedo definir esto?

que podía hacer:

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

por lo MongoDB lo reconocería como el campo id, y adaptar mi código para referirse a _id en lugar de email pero que no se siente limpio para mí.

¿Alguien?

+7

Creo que es mejor dejar _id como un ID de objeto y hacer un índice único de correo electrónico. – JohnnyHK

+0

¿Es ese el consenso general? Tener Domain-Id's como Unique y dejar que MongoDB se encargue de los Id técnicos. –

+0

Dado que está utilizando Mongoose, otra opción sería usar la cadena de correo electrónico como el campo _id y luego agregar un [campo virtual] (http://mongoosejs.com/docs/virtuals.html) llamado "correo electrónico" que devolvió el _id para limpiar el código que usa el correo electrónico. – JohnnyHK

Respuesta

32

Dado que está utilizando Mangosta, una opción es utilizar la cadena de correo electrónico como el campo _id y luego añadir un virtual field llamado email que devuelve el _id para limpiar el código que utiliza el correo electrónico.

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

Tenga en cuenta que un campo virtual no se incluye por defecto al convertir un documento Mangosta a un objeto JS simple o cadena JSON. Para incluir a ella hay que establecer la opción virtuals: true en la llamada toObject() o toJSON():

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

¿Podría mostrar cómo se verá el código de operación con su solución, por favor? –

+1

@ZackS Buena idea - agregada. – JohnnyHK

+0

Para hacer la respuesta más completa, agregué más detalles sobre campos virtuales, parece ser una pregunta común. –

Cuestiones relacionadas