在 Mongoose 中引用另一个模式的属性?

Posted

技术标签:

【中文标题】在 Mongoose 中引用另一个模式的属性?【英文标题】:Referencing another schema's property in Mongoose? 【发布时间】:2022-01-21 03:51:54 【问题描述】:

考虑以下几点:

我有一个User 架构:

const UserSchema = new mongoose.Schema(
  
    email: 
      type: String,
      required: true,
      trim: true,
      lowercase: true,
      index:  unique: true ,
      validate: 
        validator: emailValidator.validate,
        message: props => `$props.value is not a valid email address!`
      
    ,
    password: 
      type: String,
      required: true,
      trim: true,
      index:  unique: true ,
      minlength: 7,
      maxlength: 11
    ,
    roles: [ type: 'String' ],
    isVerified:  type: Boolean, default: false ,
    passwordResetToken: String,
    resetPasswordExpires: Date
  ,
  
    timestamps: true
  
);


export default mongoose.models.User || mongoose.model('User', UserSchema)

我有一个Profile 架构:

const ProfileSchema = new Schema(
  name: 
    type: String,
  ,
  email: 
    type: Schema.Types.ObjectId, ref: 'User',
  ,
  password: 
    type: Schema.Types.ObjectId, ref: 'User',
  ,
  interestedActivities: 
    type: String,
  ,
  memerSince:  type: Date, default: Date.now 
)


export default mongoose.models.Profile || mongoose.model('Profile', ProfileSchema)

以上内容是否会自动使用来自用户的emailPassword 填充ProfileSchema

所以在我的route/api 例如/api/profile 例如,它会隐含地知道两者是链接的吗?

如果我这样做了:

../../models/Profile导入配置文件

handler
  .use(auth)
  .get((req, res) => 
     Profile.findOne(
    
      email: req.body.email
    ,
  );


export default handler

它应该返回在用户中创建的电子邮件?

提前致谢!

【问题讨论】:

【参考方案1】:

不,它不会自动填充e-mailpassword。您也不能将电子邮件分配给reference 地点。如果您尝试这样做,您将获得Validation Error。因为你刚刚定义为ObjectId

  email: 
    type: Schema.Types.ObjectId, ref: 'User',
  

ref 返回userId,您可以使用此userId 进行填充。像这样:

handler
  .use(auth)
  .get((req, res) => 
     Profile.findOne(
    
      userId: req.body.userId
    ,
  ).populate('userId').select('email password bla bla');


export default handler

【讨论】:

以上是关于在 Mongoose 中引用另一个模式的属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Mongoose 中将一个模式的引用添加到另一个模式并通过 json 插入数据?

我们可以将 Mongoose 模式模型的属性定义为另一个模型吗

如何使用 Mongoose 从另一个虚拟中访问虚拟属性

Mongoose

Mongoose:如何计算其他模式引用的模式数量?

Mongoose 存储另一个集合的 ObjectId 的引用