如何使用Node.Js,MongoDB,Mongoose,Express计算博客帖子(登录和未登录用户)的唯一视图

时间:2018-02-28 01:51:11

标签: node.js mongodb express mongoose express-session

我想显示博客文章被阅读的次数与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 %>

1 个答案:

答案 0 :(得分:0)

一种方法可能(可能需要更改)

  
      
  1. 在加载UI页面之前,脚本会在浏览器中检查用户令牌(单独的令牌或一些随机字符串令牌)。
  2.   
  3. 如果令牌不可用,则发送新令牌的请求以及page-id。
  4.   
  5. 如果令牌可用,请使用令牌和page-id调用API。
  6.   
  7. 确保每次页面加载甚至页面转换都会调用它。
  8.   

后端实现可以像

  
      
  1. 页面集合将包含页面ID以及访问次数:[]字段。
  2.   
  3. 一个API创建令牌并将其存储在单独的集合(用户)中,并在步骤3之后。
  4.   
  5. 另一个API将令牌和页面ID作为输入,它将首先。检查令牌在我们的集合(用户)中是否可用,如果是,它将使用
  6. 对页面集合进行mongo更新   
db.pages.update(
   { _id: page-id },
   { $addToSet: {visits: [ user_token ] } }
)

如果存储的令牌是唯一的,则无需担心任何问题。如果需要,我们可以维护一个名为 visitCount 的单独字段,一旦执行查询,就会使用最新计数更新至少一条记录。

<强>赞成

  
      
  1. 页面刷新不会影响计数。
  2.   
  3. 令牌也在我们的最后维护,以便我们验证。
  4.   

<强>缺点

  
      
  1. 我们需要巨大的空间来存储这些令牌,如果用户长时间没有访问该网站,我们必须删除它们。
  2.   
  3. API调用开销。
  4.