【问题标题】:Mongoose: how to set a schema-field to be the ID?Mongoose:如何将模式字段设置为 ID?
【发布时间】:2012-05-08 08:03:18
【问题描述】:

给定以下架构:

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 但这对我来说并不干净。

有人吗?

【问题讨论】:

  • 我认为您最好将 _id 保留为 ObjectID 并将电子邮件设为唯一索引。
  • 这是普遍共识吗?将域 ID 设为唯一并让 MongoDB 处理技术 ID?
  • 由于您使用的是 Mongoose,另一种选择是使用电子邮件字符串作为 _id 字段,然后添加一个名为“email”的virtual field,它返回 _id 以清理使用的代码电子邮件。

标签: mongodb mongoose


【解决方案1】:

由于您使用的是 Mongoose,一种选择是使用电子邮件字符串作为 _id 字段,然后添加一个名为 emailvirtual field 以返回 _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 });

【讨论】:

  • 为了使答案更完整,我添加了有关虚拟字段的更多详细信息-似乎是常见问题。
  • 看起来该编辑已被拒绝@SmartyTwiti。这个概念很好,所以我合并了这些信息。谢谢。
猜你喜欢
  • 2016-03-09
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
相关资源
最近更新 更多