MongoDB 巨大的文档或多个查询
Posted
技术标签:
【中文标题】MongoDB 巨大的文档或多个查询【英文标题】:MongoDB huge document or multiple queries 【发布时间】:2017-03-13 20:09:16 【问题描述】:我有一个小问题。我想创建一个用户可以喜欢帖子的软件。现在我想知道如何保存喜欢。我可以这样做:
_id:"123456789",
text:"test",
likes:[
username:"User1"
,
username:"User2"
]
有了这个解决方案,我有一个内部数组。但是当我想查询这篇文章并且这篇文章有大量的喜欢时,它每次都会加载带有大数组的整个对象。我认为这需要很多性能。一个好处是我可以得到帖子并检查我是否喜欢这个帖子。
现在我有了这个解决方案:
_id="123456789",
text:"test"
这是没有赞的帖子。在另一个这样的集合中:
_id="111111111",
username:"User1",
postId:"123456789"
_id="222222222",
username:"User2",
postId:"123456789"
是喜欢。优点是您可以加载较小的对象,但每个类似的对象都需要大量磁盘空间。而且您无法通过一次查询获得我喜欢它的帖子和信息。因此,如果我想获得 20 个帖子,我不能只使用一个查询,我需要 21 个。
那么,最好的选择是什么?或者还有其他更好的解决方案吗?例如,Instagram 如何解决这个问题。你得到这个帖子,看看你是否喜欢它,它有超过 100 万个喜欢,等等。内部数组会很大。
感谢您的帮助!
【问题讨论】:
【参考方案1】:您的架构设计将帖子作为文档 _id 并将用户作为文档添加到内部数组中,肯定会对性能产生影响,因为如果帖子有超过 100 万的点赞数等,那么内部数组就会很大。
我喜欢的替代方法
有两个集合 User 和 Post
用户架构
_id: 1,
user_id: "1234ABC",
user_name: "MyFriend",
postsLiked: [
post: 1
],
postsDisLiked: [
post: 2
]
帖子架构
_id: 1,
post_name: "My first article",
author: "Best",
likesCount: 25,
dislikesCount: 10
_id: 2,
post_name: "Why Bored",
author: "Best",
likesCount: 10,
dislikesCount: 7
这个架构是基于这样一个假设设计的
为了维护好恶数据,我们需要做以下事情
User likes a post
if post not exists in postsLiked array and post not in postsDisLiked array
Add the post in postsLiked array of User Document
if post in postsDisLiked array
Remove the post in postsDisLiked array and add it in postsLiked array
if post in postsLiked array
Do nothing
User dislikes a post
if post not exists in postsLiked array and post not in postsDisLiked array
Add the post in postsDisLiked array of User Document
if post in postsLiked array
Remove the post in postsLiked array and add it in postsDisLiked array
if post in postsDisLiked array
Do nothing
如果我们想在视图用户$lookup 中一起显示用户和他/她喜欢/不喜欢的帖子
希望对你有帮助!
【讨论】:
谢谢,看起来不错。但是我可以用 $lookup 得到一个布尔值来检查用户中的数组是否包含帖子 ID 吗?那么我可以用一个查询来检查它吗?因为我认为它只是从另一个集合中获取一些值,不是吗? $exists - docs.mongodb.com/manual/reference/operator/query/exists 将帮助您获得布尔值。但据我所知,我们无法在单个查询中检查和更新/删除。以上是关于MongoDB 巨大的文档或多个查询的主要内容,如果未能解决你的问题,请参考以下文章