Как я могу посчитать просмотр определенного сообщения пользователем? Считайте каждого пользователя только один раз - PullRequest
0 голосов
/ 08 января 2019

У нас есть модель пользователя и новостей, в модели новостей у нас есть поле e viewsCount, я хочу увеличить это число просмотров, когда запрос GET сделан с помощью User.

Когда конкретный пользователь делает запрос GET, количество просмотров увеличивается на единицу, у каждого пользователя - только одно представление.

const NEWSModel = new Schema({
    viewesCount: { type: Number },
    Publisher: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User',
        required: true
    },
    LikesCount: { type: Number },
    DislikeCount: { type: Number },
    Comments: CommenTs
});

Каждый пользователь может просматривать новости столько раз, сколько захочет, но только один может просмотреть. Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Вы можете иметь другое поле с именем viewedBy типа array, в котором вы можете хранить идентификаторы пользователей. Тогда вам будет проще проверить, просматривал ли пользователь ваши сообщения или считать их.

Файл: news.model.js

const News = new Schema({
  viewedBy: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: "User"
  }],
  // other properties...
});

Файл: news.controller.js

const user = User.find({...}); // get current user
const news = News.find({...}); // get a news

/* 
  Update views count by adding the current user id if it's not already added
  Thanks to '$addToSet', the update() function will do nothing if the user id it's already there)
*/
news.update({ $addToSet: { viewedBy: user._id } });

// Getting the views count
console.log('Total views:', news.viewedBy.length);

Подробнее о $addToSet: https://docs.mongodb.com/manual/reference/operator/update/addToSet/

0 голосов
/ 08 января 2019

Если у вас не так много пользователей, вы можете добавить дополнительное поле к модели новостей, например users_viewed, которое будет массивом уникальных идентификаторов пользователей.
И сделайте дополнительную проверку, прежде чем увеличивать количество просмотров.
Если пользователь, который запрашивал новости, уже находится в этом массиве users_viewed, вы пропускаете любые дополнительные действия.
Если нет, увеличьте счетчик просмотров.

Но если у вас много пользователей, лучше сохранить счетчик просмотров в Redis, чтобы пропустить запрос к базе данных и увеличить счетчик памяти.
Логика хранения и отображения данных будет такой же, но вы уменьшите нагрузку на базу данных и ускорите весь процесс.

[ОБНОВЛЕНИЕ] Согласно вашему комментарию, о количестве пользователей.
Чтобы все заработало, вы можете использовать этот пакет .

Прежде всего, после запроса новостей от клиента вы можете сохранить все данные новостей в своем кэше (чтобы уменьшить количество запросов к вашей базе данных).
Теперь у вас есть несколько возможных способов обработки количества просмотров.
Я думаю, что проще всего было бы добавить уникальный идентификатор пользователя в SET . И вернуть количество пользователей в SET, используя SCARD ;
В этом решении вам не нужно проверять, смотрел ли пользователь уже новости, потому что заданная структура данных содержит только уникальные значения (по той же причине, по которой нам нужно использовать уникальный идентификатор пользователя).
И вы просто используете 2 запроса redis, что очень хорошо для сервисов с большой нагрузкой.

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