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

时间:2010-08-16 07:11:01

标签: mysql database-design wordpress mongodb

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

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

2 个答案:

答案 0 :(得分:4)

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

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函数:

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值。这取决于你:)

答案 1 :(得分:1)

怎么样:

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

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

  • 用户的每次特定投票都将直接引用用户对象中的注释ID。