Для реализации ТОП просмотров за день, неделю и месяц в 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
для ускорения поиска.