Mysql 如何在mongodb中表示线程化注释(以及注释投票)的数据?

Mysql 如何在mongodb中表示线程化注释(以及注释投票)的数据?,mysql,database-design,wordpress,mongodb,Mysql,Database Design,Wordpress,Mongodb,对于我的博客,我想加入我自己的评论系统,而不依赖默认的wordpress评论系统。我需要comments模块使用mongodb而不是mysql,该模块需要支持以下内容: 线程注释 评论投票 评论投票需要按照每个评论作者对整个博客进行汇总 在这种情况下,在mongodb中表示数据的最佳方式是什么 所有注释的单个集合。每个评论对象都包含一个对父评论对象的引用,用于线程化,当然还有对父博客文章的引用 每个comment对象还具有数字投票计数,可以使用mongo的原子更新进行更新 然后,用户的每次特定

对于我的博客,我想加入我自己的评论系统,而不依赖默认的wordpress评论系统。我需要comments模块使用mongodb而不是mysql,该模块需要支持以下内容:

  • 线程注释
  • 评论投票
  • 评论投票需要按照每个评论作者对整个博客进行汇总
  • 在这种情况下,在mongodb中表示数据的最佳方式是什么

    • 所有注释的单个集合。每个评论对象都包含一个对父评论对象的引用,用于线程化,当然还有对父博客文章的引用

    • 每个comment对象还具有数字投票计数,可以使用mongo的原子更新进行更新

    • 然后,用户的每次特定投票都会直接引用用户对象中的注释id


    只需将评论存储在您的博客上即可。您想要线程化/嵌套注释吗?然后以嵌套方式存储它们:

    postId: {
      comments: [
        {
          id: "47cc67093475061e3d95369d" // ObjectId
          title: "Title of comment",
          body: "Comment body",
          timestamp: 123456789,
          author: "authorIdentifier",
          upVotes: 11,
          downVotes: 2,
          comments: [
            {
              id: "58ab67093475061e3d95a684"
              title: "Nested comment",
              body: "Hello, this is a nested/threaded comment",
              timestamp: 123456789,
              author: "authorIdentifier",
              upVotes: 11,
              downVotes: 2,
              comments: [
                // More nested comments
              ]
            }
          ]
        },
        {
          // Another top-level comment
        }
      ]
    }
    
    postId
    指的是评论所属的博客帖子,它已被用作文档的键(或MongoDB中的
    \u id
    )。每个评论都有一个唯一的
    id
    ,以便对单个评论进行投票或评论

    要获得聚合投票,您需要按照以下方式编写map reduce函数:

    function map() {
      mapRecursive(this.comments)
    }
    
    function mapRecursive(comments) {
      comments.forEach(
        function (c) {
          emit(comment.author, { upVotes: c.upVotes, downVotes: c.downVotes });
          mapRecursive(c.comments);
        }
      );
    }
    
    function reduce(key, values) {
      var upVotes = 0;
      var downVotes = 0;
    
      values.forEach(
        function(votes) {
          upVotes += votes.upVotes;
          downVotes += votes.downVotes;
        }
      );
    
      return { upVotes: upVotes, downVotes: downVotes };
    }
    

    我没有测试这些函数,它们也没有检查
    null
    值。这取决于你:)

    在一个单独的表中维护所有用户的汇总投票结果,并在评论被上/下投票时操纵用户的投票计数,是否有不利之处?@Varma:不太可能。唯一的缺点是额外的维护以及聚合数据与实际计票不同步的理论可能性。但这些都是你不必担心的小缺点。您始终可以运行每周/每月一次的流程,根据实际数据重新计算聚合,以确保它们是同步的。mongodb中的map reduce查询不是实时的。因此,这不会很好地执行。对于低流量的网站来说没问题,但不会扩展。@numan:在这种情况下,您必须保留一个单独的汇总计票集合,正如前面的评论中所讨论的那样。