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 巨大的文档或多个查询的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB - 聚合查询

MongoDB:数据类型插入文档查询文档

MongoDB - 加载文档子集以进行查询

MongoDB - 查询匹配数组值的多个文档;

基于多个子文档的MongoDB/Mongoose查询

MongoDB - 多个查询和单个文档结果