Как представить данные для многопоточных комментариев (вместе с голосованием по комментариям) в mongodb? - PullRequest
3 голосов
/ 16 августа 2010

Для моего блога я хочу включить свою собственную систему комментирования, не полагаясь на стандартную систему комментирования WordPress. Мне нужен модуль комментариев, чтобы использовать mongodb вместо mysql , и модуль нуждается в поддержке следующего:

  1. Резьбовые комментарии
  2. Комментарии к голосованию
  3. Голоса комментариев должны быть агрегированы по каждому автору комментария для всего блога.

В этом контексте, Каков наилучший способ представления данных в mongodb?

Ответы [ 2 ]

4 голосов
/ 16 августа 2010

Просто сохраните комментарии так, как вы хотите, чтобы они были представлены в вашем блоге. Вы хотите многопоточные / вложенные комментарии? Затем сохраните их во вложенном виде:

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 относится к сообщению в блоге, к которому принадлежат комментарии, и использовалось в качестве ключа (или _id в MongoDB) документа. Каждый комментарий имеет уникальный id, чтобы голосовать или комментировать отдельные комментарии.

Чтобы получить агрегированные голоса, вам нужно написать функции уменьшения карты где-то по следующим направлениям:

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 голос
/ 16 августа 2010

Как насчет:

  • Единая коллекция для всех комментариев. Каждый объект комментария содержит ссылку на родительский объект комментария для создания потока и, конечно, ссылку на родительский пост в блоге.

  • Каждый объект комментария также имеет числовой счетчик голосов, который можно обновлять с помощью атомарных обновлений mongo.

  • Каждый конкретный голос пользователя будет тогда ссылкой на идентификатор комментария непосредственно в объекте пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...