Mongoose: how to set a schema-field to be the ID?

mongodb, mongoose

Solution

Since you're using Mongoose, one option is to use the email string as the `_id` field and then add a virtual field named `email` that returns the `_id` to clean up the code that uses the email.

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

Note that a virtual field is not included by default when converting a Mongoose doc to a plain JS object or JSON string. To include it you have to set the `virtuals: true` option in the `toObject()` or `toJSON()` call:

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

Problem

Given the following schema: ``` var UserSchema = new Schema({ , email : { type: String } , passwordHash : { type: String } , roles : { type: [String] } }); ``` I'd like `email` to be the key. How can I define this? I could do: ``` var UserSchema = new Schema({ , _id: { type: String } , passwordHash : { type: String } , roles : { type: [String] } }); ``` so MongoDB would recognize it as the id-field, and adapt my code to refer to `_id` instead of `email` but that doesn't feel clean to me. Anyone?

Original source