3


0

mongodbでスレッドコメントのデータを(コメント投票とともに)どのように表現するのですか?

私のブログでは、デフォルトのワードプレスのコメントシステムに依存せずに、独自のコメントシステムを組み込みたいと考えています。 * mysql の代わりに mongodb *を使用するためにコメントモジュールが必要であり、モジュールは次のサポートが必要です。

  1. スレッドコメント

  2. コメント投票

  3. コメントへの投票は、コメント作成者ごとに集計する必要があります ブログ全体。

このコンテキストでは、mongodbでデータを表す最良の方法は何ですか?

2 Answer


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


どうですか?

  • すべてのコメントの単一のコレクション。 各コメントオブジェクトには スレッド化のための親コメントオブジェクトへの参照、そしてもちろん、親ブログ投稿への参照。

  • 各コメントオブジェクトには、更新可能な数値投票数もあります mongoのアトミックアップデートを使用します。

  • ユーザーによる特定の投票は、それぞれへの参照になります ユーザーのオブジェクト内のコメントのID。