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

Mongodb Mongoose:如何将模式字段设置为ID?,mongodb,mongoose,Mongodb,Mongoose,给定以下模式: var UserSchema = new Schema({ , email : { type: String } , passwordHash : { type: String } , roles : { type: [String] } }); 我希望电子邮件成为关键。 我如何定义这一点 我可以做到: var UserSchema = new Schema({ , _id: { type: String } ,

给定以下模式:

var UserSchema = new Schema({
   , email   :  { type: String }
   , passwordHash   :  { type: String }
   , roles  :  { type: [String] }
});
我希望
电子邮件
成为关键。
我如何定义这一点

我可以做到:

var UserSchema = new Schema({
       , _id:  { type: String }
       , passwordHash   :  { type: String }
       , roles  :  { type: [String] }
    });
因此MongoDB会将其识别为id字段,并修改我的代码以引用
\u id
,而不是
电子邮件
,但我觉得这并不干净


有人吗?

因为您使用的是Mongoose,一个选项是使用电子邮件字符串作为
\u id
字段,然后添加一个名为
的电子邮件
,该电子邮件返回
\u id
,以清除使用电子邮件的代码

var userSchema=新模式({
_id:{type:String},
密码哈希:{type:String},
角色:{type:[String]}
});
userSchema.virtual('email').get(函数(){
返回此。\u id;
});
var User=mongoose.model('User',userSchema);
User.findOne(函数(err,doc){
console.log(doc.email);
});
请注意,在将Mongoose文档转换为普通JS对象或JSON字符串时,默认情况下不包括虚拟字段。要包含它,您必须在or调用中设置
virtuals:true
选项:

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

我认为你最好把id作为ObjectID,让电子邮件成为一个独特的索引。这是普遍的共识吗?将域Id设置为唯一,并让MongoDB处理技术Id?由于您使用的是Mongoose,另一种选择是使用电子邮件字符串作为_Id字段,然后添加一个返回_Id的命名“电子邮件”,以清理使用电子邮件的代码。为了使答案更完整,我添加了更多关于虚拟字段的详细信息——这似乎是一个常见的问题。看起来编辑被@SmartyTwiti拒绝了。虽然这个概念很好,但我还是加入了这个信息。谢谢