我想显示博客文章被阅读的次数与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
字段中,然后使用{{1 }}
<%= main.viewCount %>
答案 0 :(得分:0)
一种方法可能(可能需要更改)
- 在加载UI页面之前,脚本会在浏览器中检查用户令牌(单独的令牌或一些随机字符串令牌)。
- 如果令牌不可用,则发送新令牌的请求以及page-id。
- 如果令牌可用,请使用令牌和page-id调用API。
- 确保每次页面加载甚至页面转换都会调用它。
醇>
后端实现可以像
- 页面集合将包含页面ID以及访问次数:[]字段。
- 一个API创建令牌并将其存储在单独的集合(用户)中,并在步骤3之后。
- 另一个API将令牌和页面ID作为输入,它将首先。检查令牌在我们的集合(用户)中是否可用,如果是,它将使用
对页面集合进行mongo更新 醇>
db.pages.update(
{ _id: page-id },
{ $addToSet: {visits: [ user_token ] } }
)
如果存储的令牌是唯一的,则无需担心任何问题。如果需要,我们可以维护一个名为 visitCount 的单独字段,一旦执行查询,就会使用最新计数更新至少一条记录。
<强>赞成强>
- 页面刷新不会影响计数。
- 令牌也在我们的最后维护,以便我们验证。
醇>
<强>缺点强>
- 我们需要巨大的空间来存储这些令牌,如果用户长时间没有访问该网站,我们必须删除它们。
- API调用开销。
醇>