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

问题描述 投票:0回答:1

我想显示博客文章被阅读的次数与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字段中,然后使用<%= main.viewCount %>以HTML格式呈现

    // 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'
      }
     });
node.js mongodb express mongoose express-session
1个回答
0
投票

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

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

后端实现可以像

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

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

优点

  1. 页面刷新不会影响计数。
  2. 令牌也保留在我们的最后,所以我们可以验证。

缺点

  1. 我们将需要巨大的空间来存储这些令牌,如果用户长时间没有访问该站点,我们必须删除它们。
  2. API调用开销。
© www.soinside.com 2019 - 2024. All rights reserved.