多态引用列表

时间:2016-08-01 21:29:56

标签: javascript node.js mongodb mongoose

我有以下架构:用户,目标和成就

在用户架构中,我需要用户喜欢的项目列表。项目是成就或目标。

所以我需要这样的东西:

User: {
  email:     { type: String },
  username:  { type: String },
  password:  { type: String },
  firstName: { type: String }
  lastName:  { type: String },
  likes:     [ { type: ObjectId, ref: 'Goal/Achievement' } ],
}

如何在单个对象ID列表中引用多个模式?

编辑:尝试更具体......

这是一个用户示例:

{
  email: "myemail@gmail.com"
  username: "juanfuentes"
  password: "5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8"
  firstName: "Juan"
  lastName: "Fuentes"
  likes: [
    ObjectId("579bc55d57fd27f802569061"), 
    ObjectId("5797bc7a86fc997203b52acc"), 
    ObjectId("579bc4fa3fe32af302e098a1"), 
    ObjectId("57968fd0c54d7bb9058fff77")
  ]
}

ObjectId("579bc55d57fd27f802569061")属于目标

ObjectId("5797bc7a86fc997203b52acc")属于成就

ObjectId("579bc4fa3fe32af302e098a1")也属于目标

ObjectId("57968fd0c54d7bb9058fff77")属于成就

所以,如果喜欢是一个目标列表,我会这样声明:

likes: [ { type: ObjectId, ref: 'Goal } ]

如果喜欢是成就列表,我会这样声明:

likes: [ { type: ObjectId, ref: 'Achievement' } ]

但是,我希望喜欢成为目标和成就的列表。而且我不知道如何宣布这样的事情。

3 个答案:

答案 0 :(得分:0)

使用DBRef它是一个对象,由文档ID,引用文档所在的集合名称以及可选的数据库名称组成。

答案 1 :(得分:0)

在我看来,您正在寻找用户与目标/成就之间的多对多关系

在这种情况下,一个好的方法是创建2个额外的模式,以便将用户链接到目标和成就表;像这样:

额外架构1:

UserLikedGoals: {
  userId:    { type: ObjectId, ref: 'User' },
  goalId:    { type: ObjectId, ref: 'Goal' },
}

额外架构2:

UserLikedAchievements: {
  userId:    { type: ObjectId, ref: 'User' },
  achievementId:    { type: ObjectId, ref: 'Achievement' },
}

您可以通过在新架构中查找包含此用户ID的行来访问特定用户的所需目标/成就。

答案 2 :(得分:0)

在这里找到答案:https://stackoverflow.com/a/35470271/2454036

我想我还需要更多的搜索......