javascript - 我如何使用 Mongoose 确定用户是否喜欢帖子

标签 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?

最佳答案

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

我会为帖子创建一个模式并将喜欢的 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');

希望对你有帮助。

关于javascript - 我如何使用 Mongoose 确定用户是否喜欢帖子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45041511/

相关文章:

arrays - 更新 MongoDB 中集合数组内的集合

javascript - 使用纯 JavaScript 从 Firestore 接收数据

JavaScript-ES6 : addEventListener call a class methode with paramteter is not working

javascript - 用户在 session 仍然经过身份验证时单击后退按钮并被重定向到 node.js 中的登录页面

javascript - Nodejs 中的 session 管理

javascript - 如何在运行 Mongodb 的 Mongoose 中执行脚本?

javascript - 如何检查是否已经有与元素关联的点击/事件

javascript - 缩放/缩放 Div 后在 Google Maps API v3 上使用绘图管理器?

javascript - 在 NodeJS 中使用数组时“未定义不是函数”

mongodb - 连接到没有 "--authenticationDatabase admin"的 mongodb 实例