如何确定帖子是不是被 Mongoose 的用户点赞

Posted

技术标签:

【中文标题】如何确定帖子是不是被 Mongoose 的用户点赞【英文标题】:How do I decide whether a post is liked by a user with Mongoose如何确定帖子是否被 Mongoose 的用户点赞 【发布时间】:2017-12-15 22:15:14 【问题描述】:

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

我的帖子是带有架构的 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?

【问题讨论】:

如果您真的阅读了"How to Model a “likes” voting system with MongoDB",那么您会在内容中发现对于“当前用户”和 UI 视角,您只需要知道“该用户”是否喜欢该帖子。这基本上是阵列上的$elemMatch 投影。 Post.findById(id, "likedByUsers": "$elemMatch": "$eq": userId ) 因为从该用户的角度来看,所有其他用户都无关紧要。在“用户”本身上也包含帖子也是多余的。 【参考方案1】:

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

我会为 Post 创建一个架构并将 Liked 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');

希望对你有帮助。

【讨论】:

所以当用户看到帖子时,我需要if (post.likes.includes(userId)) // already liked ?对每个带有可能有数千个 ID 的 like 数组的帖子执行此操作不是很繁重吗? 在请求中发送用户ID不是更好吗,这样我可以让数据库搜索likes数组,只返回一个布尔字段,说明用户是否喜欢该帖子? 当您处理数千个 ID 时,计算任何东西总是很痛苦。处理它的最佳方法是尽可能缓存所有内容。 @Jamgreen - 嗨。我正在尝试完成类似的事情。您是如何在 UI 中检查用户是否喜欢该帖子的?这种方法感觉不像您分享的那样正确。 if (post.likes.includes(userId) 用户应该有likedPost[]。想象一下 1000 个用户和 10,000 个帖子。用户的点赞数通常比一篇好帖子的点赞数要少得多(这使得搜索成本更低)。至于帖子,如果只显示总赞就足够了,您可以在每个赞上加上totalLikes:Number$inc。但是,如果用户数量很大,搜索所有用户的喜欢数组效率不高。在这种情况下,您也可以在帖子中添加User[]

以上是关于如何确定帖子是不是被 Mongoose 的用户点赞的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NodeJS 和 Mongoose 中填充需要引用用户名的帖子

如何使用 mongodb 和 mongoose 从帖子模型中计算整体帖子活动(喜欢、不喜欢、评论)和用户模型中的参考总和

如何刷新表视图以使索引也更新?

Mongoose 聚合并获得点赞数

在前端的帖子中更新 likes 数组

Swift - 如何实现“点赞帖子”