Как реализовать ТОП просмотров за день, неделю и месяц?

Для реализации ТОП просмотров за день, неделю и месяц в Node.js, существует несколько подходов. Один из них — использование базы данных, например MongoDB, и хранение информации о просмотрах в коллекции с соответствующими полями, такими как идентификатор, дата и время просмотра, идентификатор элемента (например, статьи, видео и т. д.). Для получения ТОП-просмотров, можно написать запрос, который отсортирует документы по дате/времени и ограничит результаты нужным количеством.

Вот пример реализации с использованием MongoDB:

1. Подключиться к базе данных MongoDB при помощи официального драйвера, например mongodb или mongoose.

const MongoClient = require('mongodb').MongoClient;
const url = 'mongodb://localhost:27017';
const dbName = 'mydb';

MongoClient.connect(url, function(err, client) {
  console.log("Connected successfully to server");
  const db = client.db(dbName);
  // Здесь можно продолжить с использованием объекта db
});

2. Создать коллекцию для хранения просмотров. В данном случае, назовем ее views.

const collection = db.collection('views');

3. Регистрировать просмотры, добавляя документы в коллекцию views:

const view = {
  itemId: 1, // Идентификатор элемента
  datetime: new Date() // Дата и время просмотра
};

collection.insertOne(view, function(err, result) {
  if (err) throw err;
  console.log("View registered");
});

4. Получить ТОП просмотров за день, неделю и месяц, используя агрегационные функции MongoDB. Для этого нужно написать запросы, которые группируют документы по дате/времени и сортируют их по убыванию количества просмотров. Например:

const oneDayAgo = new Date(Date.now() - 24 * 60 * 60 * 1000);
const oneWeekAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000);
const oneMonthAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000);

// ТОП просмотров за день
collection.aggregate([
  { $match: { datetime: { $gte: oneDayAgo } } },
  { $group: { _id: '$itemId', count: { $sum: 1 } } },
  { $sort: { count: -1 } },
  { $limit: 10 }, // Показать только 10 элементов
]).toArray(function(err, result) {
  if (err) throw err;
  console.log("TOP views for the day:", result);
});

// ТОП просмотров за неделю
collection.aggregate([
  { $match: { datetime: { $gte: oneWeekAgo } } },
  { $group: { _id: '$itemId', count: { $sum: 1 } } },
  { $sort: { count: -1 } },
  { $limit: 10 }, // Показать только 10 элементов
]).toArray(function(err, result) {
  if (err) throw err;
  console.log("TOP views for the week:", result);
});

// ТОП просмотров за месяц
collection.aggregate([
  { $match: { datetime: { $gte: oneMonthAgo } } },
  { $group: { _id: '$itemId', count: { $sum: 1 } } },
  { $sort: { count: -1 } },
  { $limit: 10 }, // Показать только 10 элементов
]).toArray(function(err, result) {
  if (err) throw err;
  console.log("TOP views for the month:", result);
});

Таким образом, вы сможете получить ТОП просмотров за день, неделю и месяц, используя базу данных MongoDB и описанную выше логику. Чтобы улучшить производительность, также рекомендуется добавить индексы на поле datetime для ускорения поиска.