如何确定帖子是不是被 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 从帖子模型中计算整体帖子活动(喜欢、不喜欢、评论)和用户模型中的参考总和