如何判断Mongoose用户是否喜欢帖子

时间:2017-07-11 17:54:30

标签: javascript node.js mongodb database-design mongoose

我正在尝试创建一个功能,以便用户可以喜欢帖子(用户喜欢的帖子或用户不喜欢的帖子,即不喜欢或投票)。

我的帖子是带有架构的MongoDB集合中的对象

{
  title: String,
  text: String
}

而我的用户有架构

{
  username: String,
  password: String
}
例如,我可以在帖子中创建一个数组,其中包含喜欢特定帖子的用户的ID。它看起来像

{
  title: String,
  text: String,
  likedByUsers: [ObjectID]
}

或者我可以在用户使用用户喜欢的帖子的ID创建一个数组,这类似于

{
  username: String,
  password: String,
  postsLiked: [ObjectID]
}

但是,我希望用户会喜欢上千个帖子,所以我可能会面对MongoDB中对象大小的限制。

所以我想我应该创建一个喜欢

的新集合
{
  userId: ObjectID,
  postId: ObjectID
}

但是,我正在考虑如何在我的应用中检索它。

我应该存储用户(登录的用户)喜欢的所有帖子的ID数组,当我打印每个帖子时,我会查看帖子是否属于用户喜欢的帖子,然后显示“已经喜欢”的按钮?

或者,当我请求查看所有帖子时,我可以发送用户ID,然后为每个帖子添加一个字段“isLiked”,表示是否可以找到Liked集合中的对象,匹配这两个帖子和用户ID?

1 个答案:

答案 0 :(得分:3)

MongoDB中的文档限制是16mb,这是非常巨大的。除非您尝试创建下一个Facebook,否则将ID放入阵列中将不成问题。我在单个文档数组中有10k + ID的生产工作流程,没有问题。问题不应该与文档大小有关,您必须根据您需要的查询选择放置文档的位置。

我会为Post创建一个架构并将喜欢的ID放在那里,例如:

{
    title: { type: String },
    text: { type: String },
    likes: [{ type: ObjectId, ref: 'users' }]
}

帖子会变老,人们会不再喜欢它,所以如果放入Post而不是User集合,那么数组的中等大小应该更简单。此外,通过添加ref属性,您可以使用Mongoose Populate API,因此您可以查询以下帖子:

Posts.find().populate('likes');

这将为您提供阵列中的完整用户信息。要搜索单个用户喜欢的帖子,也很简单:

Posts.find({likes: userId}).populate('likes');

希望它对你有所帮助。