关于mysql:如何在mongodb中表示线程注释的数据(以及注释投票)?

How to represent the data for threaded comments(along with comment voting) in mongodb?

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

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


    只需存储您想要在博客上显示的评论。你想要线程/嵌套的评论?然后以嵌套方式存储它们:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    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中的_id)。每条评论都有一个唯一的id,以便对个别评论进行投票或评论。

    要获得聚合投票,您需要在以下某处编写map-reduce函数:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    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值。随你(由你决定 :)


    怎么样:

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

    • 每个注释对象也有数字投票计数,可以使用mongo的原子更新进行更新。

    • 然后,用户的每个特定投票将直接引用用户对象中的注释id。