27

给定以下架构:

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

我想email成为关键。我该如何定义这个?

我可以做:

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

所以 MongoDB 会将其识别为 id 字段,并调整我的代码以引用_id而不是,email但这对我来说并不干净。

任何人?

4

1 回答 1

49

由于您使用的是 Mongoose,因此一种选择是使用电子邮件字符串作为_id字段,然后添加一个名为的虚拟字段email,该字段返回_id以清理使用电子邮件的代码。

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

请注意,将 Mongoose 文档转换为纯 JS 对象或 JSON 字符串时,默认情况下不包含虚拟字段。要包含它,您必须在or调用中设置virtuals: true选项:toObject()toJSON()

var obj = doc.toObject({ virtuals: true });
var json = doc.toJSON({ virtuals: true });
于 2012-04-27T20:36:38.803 回答