Как подсчитать уникальные просмотры в сообщении блога (вошли в систему и не вошли в систему пользователя), используя 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 ответ

Один подход может быть (могут потребоваться изменения)

  1. Перед загрузкой страницы пользовательского интерфейса скрипт проверяет наличие в браузере пользовательского токена (отдельного токена или некоторого случайного строкового токена).
  2. Если токен недоступен, отправьте запрос на новый токен вместе с идентификатором страницы.
  3. Если токен доступен, вызовите API с токеном и идентификатором страницы.
  4. Убедитесь, что он вызывается для каждой загрузки страницы или даже перехода страницы.

Бэкэнд-реализация может быть как

  1. Коллекция страниц будет иметь идентификатор страницы вместе с полем посещения:[].
  2. Один API создает токен и сохраняет его в отдельной коллекции (пользователи) и выполняет шаг 3.
  3. Другой API примет в качестве входных данных токен и идентификатор страницы. проверьте, что токен доступен в нашей коллекции (пользователь), и если это так, он выполнит обновление монго на коллекции страниц с помощью
db.pages.update(
   { _id: page-id },
   { $addToSet: {visits: [ user_token ] } }
)

Этот запрос проверяет, является ли сохраненный токен уникальным, и вам не о чем беспокоиться. При необходимости мы можем сохранить отдельное поле с именем visitCount, которое обновляется с последним счетчиком после выполнения запроса, обновляя хотя бы одну запись.

Pros

  1. Обновление страницы не повлияет на количество.
  2. Маркер также поддерживается на нашем конце, чтобы мы могли проверить.

Cons

  1. Нам понадобится огромное пространство для хранения этих токенов, и мы должны удалить их, если пользователь не посещал сайт в течение очень долгого времени.
  2. API вызывает накладные расходы.
Другие вопросы по тегам