MongoDB巨大的文档或多个查询

时间:2017-03-13 20:09:17

标签: mongodb database-design social-networking database

我有一个小问题。我想创建一个用户可以喜欢帖子的软件。现在我想知道如何保存喜欢的东西。我可以这样做:

{
    _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如何解决这个问题。你收到帖子,看看你是否喜欢它,它有超过1M的喜欢等等。内部阵列将是巨大的。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

你的架构设计作为文档_id发布并在内部数组中添加用户作为文档肯定会对性能产生影响,因为如果帖子有超过1M的喜欢等,内部数组会很大。

我偏好的替代方法

有两个馆藏用户和帖子

用户架构

{
  _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
}

这个架构的设计基于这样一个假设:一个帖子得到1M以上的喜欢可以经常,而用户喜欢,不喜欢1M0000个帖子的次数较少。

为了维护喜欢和不喜欢的数据,我们需要执行以下操作

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

中一起显示用户和他/她喜欢/不喜欢的帖子

希望它有帮助!