Actualmente tengo una fecha de inicio y una fecha de finalización del año académico. Quiero obtener los datos de los estudiantes de cada semana durante este año académico. Actualmente, he creado una matriz que contiene todas las fechas de inicio y finalización de cada semana y estoy recorriendo cada semana y llamando a la base de datos cada vez de esta manera:
let allWeeksData = [] let groupQuery: any = { _id: { attendance_code: "$attendance_code", }, total: { $sum: 1 }, }; for(let dateRanges of dateRangesArray) { const startDate = dateRanges.start_date; const endDate = dateRanges.end_date; const rawResults = await sessionAttendanceModel.aggregate([ { $match: { student_school: { $in: studentSchoolIDs }, "date.date": { $gte: new Date(startDate), $lte: new Date(endDate), }, attendance_code: { $in: usedAttendanceCodes, }, }, }, { $group: groupQuery, }, ]); rawResults.start_date = startDate rawResults.end_date = endDate allWeeksData.push(rawResults) }Sin embargo, esto es bastante lento. ¿Hay alguna manera de llamar a la base de datos solo una vez usando un grupo agregado y obtener el mismo resultado final?
Puede $group todo por semanas y luego en $project en curso puede formular valores de salida según sus necesidades
Su agregación tendría algo como esto
[{ $group:{ _id:{ $week: "$date.date" }, data:{ $first: "$$ROOT" } } }]Tal vez agrupar por esto:
{ _id: { attendance_code: "$attendance_code", date: { $dateTrunc: { date: "$date.date", unit: "week", startOfWeek: "monday" } }, }, total: { $sum: 1 }, }