aggregation optimization

This commit is contained in:
Emily
2024-09-02 18:37:02 +02:00
parent c003b655ec
commit 023f2b5f4a
3 changed files with 15 additions and 20 deletions

View File

@@ -4,8 +4,6 @@ import { getUserProjectFromId } from "~/server/LIVE_DEMO_DATA";
import DateService from "@services/DateService"; import DateService from "@services/DateService";
import { executeTimelineAggregation, fillAndMergeTimelineAggregation } from "~/server/services/TimelineService"; import { executeTimelineAggregation, fillAndMergeTimelineAggregation } from "~/server/services/TimelineService";
import fs from 'fs';
export default defineEventHandler(async event => { export default defineEventHandler(async event => {
const project_id = getRequestProjectId(event); const project_id = getRequestProjectId(event);
if (!project_id) return; if (!project_id) return;
@@ -21,23 +19,18 @@ export default defineEventHandler(async event => {
if (!to) return setResponseStatus(event, 400, 'to is required'); if (!to) return setResponseStatus(event, 400, 'to is required');
if (!slice) return setResponseStatus(event, 400, 'slice is required'); if (!slice) return setResponseStatus(event, 400, 'slice is required');
// return await Redis.useCache({ return await Redis.useCache({
// key: `timeline:visits:${project_id}:${slice}:${from || 'none'}:${to || 'none'}`, key: `timeline:visits:${project_id}:${slice}:${from || 'none'}:${to || 'none'}`,
// exp: TIMELINE_EXPIRE_TIME, exp: TIMELINE_EXPIRE_TIME,
// }, async () => { }, async () => {
const timelineData = await executeTimelineAggregation({ const timelineData = await executeTimelineAggregation({
projectId: project._id, projectId: project._id,
model: VisitModel, model: VisitModel,
from, to, slice, from, to, slice,
debug: true
}); });
const timelineFilledMerged = fillAndMergeTimelineAggregation(timelineData, slice);
console.log(timelineData); return timelineFilledMerged;
fs.writeFileSync('explains/timeline-visits.json', JSON.stringify(timelineData)); });
// const timelineFilledMerged = fillAndMergeTimelineAggregation(timelineData, slice);
// return timelineFilledMerged;
// });

View File

@@ -46,7 +46,7 @@ export async function executeAdvancedTimelineAggregation<T = {}>(options: Advanc
console.log(JSON.stringify(aggregation, null, 2)); 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; return timeline;

View File

@@ -36,8 +36,10 @@ const VisitSchema = new Schema<TVisit>({
website: { type: String, required: true }, website: { type: String, required: true },
page: { type: String, required: true }, page: { type: String, required: true },
referrer: { 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<TVisit>('visits', VisitSchema); export const VisitModel = model<TVisit>('visits', VisitSchema);