Задать вопрос
@likejavascript

Как правильно пересчитывать счетчики для поста?

Я разрабатываю форум на подобии Stackowerflow и хочу с вами посоветоваться как лучше всего хранить счетчики: количество оценок, просмотров и выбор лучшего ответа.

Я использую Nodejs/MongoDB. Сейчас у меня есть две коллекции:

Posts:

[{
   _id: ObjectId(1),
   title: 'Untitled',
   content: 'empty'
}]


Votes:

[{ 
    _post: ObjectId(1),
    _user: ObjectId(...),
    vote: 1,        
}, {
    _post: ObjectId(1),
    _user: ObjectId(...),
    vote: 1,
}]


Когда пользователь голосует за пост с ObjectId(1), то отправляется следующий запрос:

Votes.create({_post: ObjectId(1), vote: 1}).exec(cb);


При получении списка постов мне приходится делать несколько запросов:

1. Запросить все посты, отсортированные по дате создания
2. Запросить все оценки по каждому посту и добавить их в посты в nodejs.

При частом запросе списка постов будут проблемы в постоянном пересчете счетчиков, я бы хотел улучшить путем пересчета сохранения счетчика прямо в посте:

[{
   _id: ObjectId(1),
   title: 'Untitled',
   content: 'empty',
   votes: 2
}]


Но в этом случае мне нужно как-то поддерживать целостность данных и гарантированно обновлять актуальные счетчики в посте на основе данных оценок в Votes.

Данную проблему можно решить встраиванием оценок в виде массива и хранить его в постах, но MongoDB не любит обновлять большие документы.

В общем посоветуйте паттерн для гарантированного пересчета счетчиков в посте, что можно использовать, очереди, версионность или что-то еще?
  • Вопрос задан
  • 374 просмотра
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
@lega
Я бы подумал о таком варианте (posts):
{
  votes: 15,
  vote: {
    user1: 1,
    user2: -1
  }
}

Одним запросом и пересчет и защита от повторного голосования, и выборка одним запросом.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы