From 023f2b5f4a2eea42d813ee109a25b713d1740d84 Mon Sep 17 00:00:00 2001 From: Emily Date: Mon, 2 Sep 2024 18:37:02 +0200 Subject: [PATCH] aggregation optimization --- .../[project_id]/timeline/visits.post.ts | 29 +++++++------------ dashboard/server/services/TimelineService.ts | 2 +- shared/schema/metrics/VisitSchema.ts | 4 ++- 3 files changed, 15 insertions(+), 20 deletions(-) diff --git a/dashboard/server/api/metrics/[project_id]/timeline/visits.post.ts b/dashboard/server/api/metrics/[project_id]/timeline/visits.post.ts index e9845e7..145cec1 100644 --- a/dashboard/server/api/metrics/[project_id]/timeline/visits.post.ts +++ b/dashboard/server/api/metrics/[project_id]/timeline/visits.post.ts @@ -4,8 +4,6 @@ import { getUserProjectFromId } from "~/server/LIVE_DEMO_DATA"; import DateService from "@services/DateService"; import { executeTimelineAggregation, fillAndMergeTimelineAggregation } from "~/server/services/TimelineService"; -import fs from 'fs'; - export default defineEventHandler(async event => { const project_id = getRequestProjectId(event); if (!project_id) return; @@ -21,24 +19,19 @@ export default defineEventHandler(async event => { if (!to) return setResponseStatus(event, 400, 'to is required'); if (!slice) return setResponseStatus(event, 400, 'slice is required'); - // return await Redis.useCache({ - // key: `timeline:visits:${project_id}:${slice}:${from || 'none'}:${to || 'none'}`, - // exp: TIMELINE_EXPIRE_TIME, - // }, async () => { - const timelineData = await executeTimelineAggregation({ - projectId: project._id, - model: VisitModel, - from, to, slice, - debug: true + return await Redis.useCache({ + key: `timeline:visits:${project_id}:${slice}:${from || 'none'}:${to || 'none'}`, + exp: TIMELINE_EXPIRE_TIME, + }, async () => { + const timelineData = await executeTimelineAggregation({ + projectId: project._id, + model: VisitModel, + from, to, slice, + }); + const timelineFilledMerged = fillAndMergeTimelineAggregation(timelineData, slice); + return timelineFilledMerged; }); - console.log(timelineData); - fs.writeFileSync('explains/timeline-visits.json', JSON.stringify(timelineData)); - - // const timelineFilledMerged = fillAndMergeTimelineAggregation(timelineData, slice); - // return timelineFilledMerged; - // }); - diff --git a/dashboard/server/services/TimelineService.ts b/dashboard/server/services/TimelineService.ts index 137ee9c..88c6e1c 100644 --- a/dashboard/server/services/TimelineService.ts +++ b/dashboard/server/services/TimelineService.ts @@ -46,7 +46,7 @@ export async function executeAdvancedTimelineAggregation(options: Advanc console.log(JSON.stringify(aggregation, null, 2)); } - const timeline: { _id: string, count: number & T }[] = await options.model.aggregate(aggregation, { explain: options.debug === true }); + const timeline: { _id: string, count: number & T }[] = await options.model.aggregate(aggregation); return timeline; diff --git a/shared/schema/metrics/VisitSchema.ts b/shared/schema/metrics/VisitSchema.ts index 9b7b7f0..0b1124e 100644 --- a/shared/schema/metrics/VisitSchema.ts +++ b/shared/schema/metrics/VisitSchema.ts @@ -36,8 +36,10 @@ const VisitSchema = new Schema({ website: { type: String, required: true }, page: { type: String, required: true }, referrer: { type: String, required: true }, - created_at: { type: Date, default: () => Date.now(), index: true }, + created_at: { type: Date, default: () => Date.now() }, }) +VisitSchema.index({ project_id: 1, created_at: -1 }); + export const VisitModel = model('visits', VisitSchema);