Hola, este es un esquema para contar la cantidad de visitantes a mis sitios, tengo varios dominios.
const mongoose = require('mongoose'); const Schema = mongoose.Schema; const VisitorSchema = Schema({ domain: String, count: Number }); module.exports = mongoose.model('Visitor', VisitorSchema);Me gustaría ahorrar en mongoDB la cantidad de visitantes a mis sitios en periodos de tiempo. En este punto, puedo aumentar la propiedad 'recuento', pero ¿qué pasa si quiero organizar por años, meses y semanas?
async function saveVisitor(domain){ let visitors = await Visitor.findOne({domain}); if(visitors == null) { const startCount = new Visitor({ domain: domain, count: 1 }); startCount.save(); } else { visitors.count++; visitors.save(); } }Entonces mi pregunta es: ¿cómo puedo crear los años como propiedades dinámicas en mangosta? Lo que tengo en mente es comenzar a contar desde una propiedad firstVisitDate. Gracias por adelantado.
{ domain: String, firstVisitDate: Date, 2022: { today: Number, week: Number, month: Number, year: Number }, 2023: { today: Number, week: Number, month: Number, year: Number, } total: Number }Puede usar node-cron para automatizar trabajos y restablecer el contador de visitantes cada medianoche: https://www.npmjs.com/package/node-cron
const nodeCron = require('node-cron'); const cron = { run: function() { nodeCron.schedule('* * * * *', () => { updateVisitorDateCounter(); }) } }; cron.run(); // run every midnightfunción actualizarVisitorDateCounter:
async function updateVisitorDateCounter() { const date = new Date(); if(date.getHours() + date.getMinutes() != 0) return;// prevent restart 'today' counter if server restarts (only works with same time setted in cron) const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; const months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; const dayName = days[date.getDay()]; const monthName = months[date.getMonth()]; const domainVisitors = await Visitor.find(); for(let visitor of domainVisitors) { visitor.today = 0; const visitorUpdated = await visitor.save(); } const newWeek = dayName === 'Sunday' ? true : false; if(newWeek) { for(let visitor of domainVisitors) { visitor.week = 0; const visitorUpdated = await visitor.save(); } } const newMonth = date.getDate() === 1 ? true : false; //first day of month if(newMonth) { for(let visitor of domainVisitors) { if(visitor.history.length == 0) { visitor.history = [{ year: date.getFullYear(), months: [{name: monthName, counter: visitor.month}] }] } else { let historyMonths = visitor.history.find(x => x.year === date.getFullYear()).months; historyMonths.push({name: monthName, counter: visitor.month}); visitor.history = [{ year: date.getFullYear(), months: historyMonths }]; } visitor.month = 0; const visitorUpdated = await visitor.save(); } } const newYear = date.getMonth() === 0 && date.getDate() === 1 ? true : false; if(newYear) { // code here ... } }esta forma no es buena y tiene algún problema, como si desea agregar más organización de pasos como visitante de 2 meses o algo así. en lugar de agregar un número en su contador, cree una serie de visitas y agregue una marca de tiempo cada vez que un usuario visite su sitio. de esta manera, puede consultar fácilmente a los visitantes para cada período de tiempo que desee, también puede crear un gráfico por tiempo de visita del visitante al sitio. puede expandir esto y al guardar la marca de tiempo con la identificación del usuario puede saber qué usuario visitó su sitio a qué hora o algo así.