Enhance smoke-tracker API to include statistics for active users only; update documentation to reflect changes in user activity criteria and statistics calculations.

This commit is contained in:
Primakov Alexandr Alexandrovich
2025-11-17 14:40:37 +03:00
parent f856d94596
commit 414383163e
2 changed files with 54 additions and 12 deletions

View File

@@ -150,9 +150,47 @@ router.get('/summary', async (req, res, next) => {
}
})
// 4. Общая статистика по всем пользователям
const globalDailyStats = await CigaretteModel.aggregate([
// 4. Определяем активных пользователей (от 2 до 40 сигарет в день в среднем)
const MIN_CIGARETTES_PER_DAY = 2
const MAX_CIGARETTES_PER_DAY = 40
const periodDays = Math.ceil((toDate.getTime() - fromDate.getTime()) / (1000 * 60 * 60 * 24))
// Получаем статистику по каждому пользователю
const userStats = await CigaretteModel.aggregate([
{ $match: globalMatch },
{
$group: {
_id: '$userId',
total: { $sum: 1 },
},
},
])
// Фильтруем активных пользователей (исключаем слишком низкие и слишком высокие значения)
const activeUserIds = userStats
.filter((stat) => {
const avgPerDay = stat.total / periodDays
return avgPerDay > MIN_CIGARETTES_PER_DAY && avgPerDay <= MAX_CIGARETTES_PER_DAY
})
.map((stat) => stat._id)
const filteredLow = userStats.filter((stat) => stat.total / periodDays <= MIN_CIGARETTES_PER_DAY).length
const filteredHigh = userStats.filter((stat) => stat.total / periodDays > MAX_CIGARETTES_PER_DAY).length
console.log('[STATS] Total users:', userStats.length)
console.log('[STATS] Active users (2-40 cigs/day):', activeUserIds.length)
console.log('[STATS] Filtered out (too low):', filteredLow)
console.log('[STATS] Filtered out (too high):', filteredHigh)
// Фильтр только для активных пользователей
const activeGlobalMatch = {
...globalMatch,
userId: { $in: activeUserIds },
}
// Общая статистика по активным пользователям
const globalDailyStats = await CigaretteModel.aggregate([
{ $match: activeGlobalMatch },
{
$group: {
_id: {
@@ -174,9 +212,9 @@ router.get('/summary', async (req, res, next) => {
const globalAveragePerDay =
globalDaysWithData > 0 ? (globalTotalCigarettes / globalDaysWithData).toFixed(2) : 0
// Общая статистика по дням недели (все пользователи)
// Общая статистика по дням недели (активные пользователи)
const globalWeekdayStats = await CigaretteModel.aggregate([
{ $match: globalMatch },
{ $match: activeGlobalMatch },
{
$group: {
_id: { $dayOfWeek: '$smokedAt' },
@@ -205,8 +243,8 @@ router.get('/summary', async (req, res, next) => {
}
})
// Количество активных пользователей в периоде
const activeUsers = await CigaretteModel.distinct('userId', globalMatch)
// Количество активных пользователей
const activeUsers = activeUserIds
const result = {
user: {