Mongoose:如何将模式字段设置为ID?

30

给定以下数据模式:

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,但这种做法对我来说不太干净。

有人可以帮忙吗?


8
我认为最好将“_id”保留为一个ObjectID类型,并将“email”设置为唯一索引。 - JohnnyHK
这是大家的共识吗?将域ID设为唯一并让MongoDB处理技术ID? - Geert-Jan
由于您正在使用Mongoose,另一个选项是将电子邮件字符串用作_id字段,然后添加一个称为“email”的虚拟字段,该字段返回_id以清理使用电子邮件的代码。 - JohnnyHK
1个回答

51

既然您正在使用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字符串时,默认情况下不包括虚拟字段。要包含它,您需要在toObject()toJSON()调用中设置virtuals: true选项:

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

1
为了让答案更完整,我添加了有关虚拟字段的更多细节 - 这似乎是一个常见问题。 - Marwen Trabelsi
1
看起来@SmartyTwiti的编辑被拒绝了。不过这个概念很好,所以我把那些信息合并进去了。谢谢。 - JohnnyHK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接