Как подсчитать уникальные просмотры в сообщении блога (вошли в систему и не вошли в систему пользователя), используя Node.Js, MongoDB, Mongoose, Express
Я хочу показать, сколько раз было прочитано сообщение в блоге, вроде того, что есть у Business Insider.
Цель...
- Количество просмотров, которое не увеличивается с каждой перезагрузкой.
- Каждый пост в блоге хранит свой счетчик просмотров
Получите счетчик из поля MongoDB/Mongoose Schema и отобразите его в HTML.
var express = require('express'); var cookieParser = require('cookie-parser'); var mongoose = require('mongoose'); var express-session = require('express-session'); //Show Blog Post router.get('/blog/:categorySlug/:slug', function (req, res) var slug = req.params.slug; Blog.findOne({'slug' : slug}).populate('comments').exec(function (err, foundBlog) { if (err) { console.log(err); } else { res.render('show', { main: foundBlog, title: foundBlog.title}); } }); });
Я знаю, что если я использую req.session.views
, он будет увеличивать количество просмотров с каждой перезагрузкой на всех страницах.
router.get('/blog/:categorySlug/:slug', function (req, res) {
req.session.views = (req.session.views || 0) + 1
var slug = req.params.slug;
Blog.findOne({'slug' : slug}).populate('comments').exec(function (err, foundBlog) {
if (err) {
console.log(err);
} else {
res.render('show', { main: foundBlog, title: foundBlog.title, pageViewCount: req.session.views});
}
});
});
Итак, что я могу сделать, чтобы сохранить количество просмотров каждого блога отдельно и сохранить это значение в этом посте? viewCount
поле в базе данных, а затем визуализировать его в HTML, используя <%= main.viewCount %>
// Blog Schema
var mainBlogSchema = new mongoose.Schema({
image: String,
imageDescription: String,
priority: {
type: String,
default: ""
},
title: String,
content: String,
author: {
id: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User',
},
username: String,
name: String,
},
slug: {
type: String,
unique: true,
},
status: String,
viewCount: {
type: Number,
default: 0,
},
category: String,
categorySlug: String,
tags: String,
updated: {
type: Boolean,
default: false
},
date: { type: Date, default: Date.now },
comments: [
{
type: mongoose.Schema.Types.ObjectId,
ref: 'Comment',
},
],
},{
timestamps: {
createdAt: 'createdAt',
updatedAt: 'updatedAt'
}
});
1 ответ
Один подход может быть (могут потребоваться изменения)
- Перед загрузкой страницы пользовательского интерфейса скрипт проверяет наличие в браузере пользовательского токена (отдельного токена или некоторого случайного строкового токена).
- Если токен недоступен, отправьте запрос на новый токен вместе с идентификатором страницы.
- Если токен доступен, вызовите API с токеном и идентификатором страницы.
- Убедитесь, что он вызывается для каждой загрузки страницы или даже перехода страницы.
Бэкэнд-реализация может быть как
- Коллекция страниц будет иметь идентификатор страницы вместе с полем посещения:[].
- Один API создает токен и сохраняет его в отдельной коллекции (пользователи) и выполняет шаг 3.
- Другой API примет в качестве входных данных токен и идентификатор страницы. проверьте, что токен доступен в нашей коллекции (пользователь), и если это так, он выполнит обновление монго на коллекции страниц с помощью
db.pages.update(
{ _id: page-id },
{ $addToSet: {visits: [ user_token ] } }
)
Этот запрос проверяет, является ли сохраненный токен уникальным, и вам не о чем беспокоиться. При необходимости мы можем сохранить отдельное поле с именем visitCount, которое обновляется с последним счетчиком после выполнения запроса, обновляя хотя бы одну запись.
Pros
- Обновление страницы не повлияет на количество.
- Маркер также поддерживается на нашем конце, чтобы мы могли проверить.
Cons
- Нам понадобится огромное пространство для хранения этих токенов, и мы должны удалить их, если пользователь не посещал сайт в течение очень долгого времени.
- API вызывает накладные расходы.