如何引用猫鼬中另一个模型的字段

时间:2020-09-29 19:19:21

标签: javascript mongodb express mongoose

我正在尝试根据用户名在Card模式中链接User模型中的某些字段。 例如,这是我的Card模式

 const CardSchema = new mongoose.Schema({
      text: {
        type: String,
      },
      username: {
       type: String,
       ref: 'User',
       required: true
      },
      userSticker: {
       This is what I need to get from the user model based on the username or user id
      }

这是用户模型的样子:

const UserSchema = new mongoose.Schema({
  username: {
    type: String,
  },
  userSticker: {
   type: String,
  }

我需要的是在Card模式中始终将具有该用户名的用户使用相同的userSticker。创建卡时添加该卡将不起作用,因为userSticker可能会发生变化,并且发生这种情况时,我也希望Card模式中的字段也发生更改,因此我想它应该像一个参考。

2 个答案:

答案 0 :(得分:0)

更新:好的,我读过猫鼬为您做了这件事。它可以根据您在模式中定义的引用对表进行关联建模并填充关联数据。

检查Relational database design to mongoDB/mongoose design

本部分适用于MongoDB

这里有两种解决方案,因为MongoDB不是像SQL这样的关系数据库。

第一个解决方案是复制数据并在字段值更改时更新所有字段

const CardSchema = new mongoose.Schema({
  text: {
    type: String,
  },
  username: {
    type: String,
  },
  userSticker: {
    type: String,
  }
})

const UserSchema = new mongoose.Schema({
  username: {
    type: String,
  },
  userSticker: {
    type: String,
  }
})

然后,每当userSticker更改时,您都需要查询卡收集并更新所有与用户名匹配的userSticker

第二个解决方案是两个手动创建集合之间的引用

const CardSchema = new mongoose.Schema({
  text: {
    type: String,
  },
  user_id: {
    type: String
  }
})

const UserSchema = new mongoose.Schema({
  _id: {
    type: String,
  },
  username: {
    type: String,
  },
  userSticker: {
    type: String,
  }
})

然后,当您查询文档卡集合时,可以再次查询user_id引用的文档

  • 第一个写入速度较慢,但​​读取速度较快
  • 第二个在写入速度上较快,但在读取速度上较慢(分页查询)

答案 1 :(得分:0)

来自猫鼬官方文档Query Population

after_resetting_password_path_for(resource)