mwenko

schema + aggregation

Oct 23rd, 2025
100
0
9 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const UserDailyReportSchema = new Schema(
  2.   {
  3.     user: {
  4.       type: Schema.Types.ObjectId,
  5.       ref: 'User',
  6.       required: true,
  7.       index: true,
  8.     },
  9.     date: { type: Date, required: true, index: true },
  10.  
  11.     // Aggregated trip metrics for the day
  12.     trips: { type: Number, default: 0 },
  13.     miles: { type: Number, default: 0 },
  14.     calories: { type: Number, default: 0 },
  15.     co2Potential: { type: Number, default: 0 },
  16.     co2Actual: { type: Number, default: 0 },
  17.     co2Savings: { type: Number, default: 0 },
  18.     dollarsPotential: { type: Number, default: 0 },
  19.     dollarsActual: { type: Number, default: 0 },
  20.     dollarsSavings: { type: Number, default: 0 },
  21.     vehicleMilesReduced: { type: Number, default: 0 },
  22.   },
  23.   { collection: 'user_daily_reports' },
  24. );
  25.  
  26. UserDailyReportSchema.index({ user: 1, date: 1 }, { unique: true });
  27. UserDailyReportSchema.index({ date: 1, user: 1 });
  28. UserDailyReportSchema.index({ date: 1 });
  29.  
  30. const pipeline: PipelineStage[] = [
  31.       // 1️⃣ Filter by date range
  32.       {
  33.         $match: {
  34.           date: { $gte: startDate, $lte: endDate },
  35.           user: { $exists: true, $ne: null },
  36.         },
  37.       },
  38.  
  39.       // 2️⃣ Group by user
  40.       {
  41.         $group: {
  42.           _id: '$user',
  43.           totalLoggedTrips: { $sum: '$trips' },
  44.           totalDistanceLogged: { $sum: '$miles' },
  45.           totalCaloriesBurned: { $sum: '$calories' },
  46.           totalCo2Potential: { $sum: '$co2Potential' },
  47.           totalCo2Emissions: { $sum: '$co2Actual' },
  48.           totalCo2Savings: { $sum: '$co2Savings' },
  49.           totalDollarsPotential: { $sum: '$dollarsPotential' },
  50.           totalVehicleMilesReduced: { $sum: '$vehicleMilesReduced' },
  51.         },
  52.       },
  53.       // 4️⃣ Add total field
  54.       {
  55.         $addFields: {
  56.           total: {
  57.             $ifNull: [{ $arrayElemAt: ['$total.count', 0] }, 0],
  58.           },
  59.         },
  60.       },
  61.     ];
  62.  
  63. const result = await UserDailyReportModel.aggregate(pipeline, {
  64.         allowDiskUse: true,
  65.       })
  66.  
  67.  
Advertisement
Add Comment
Please, Sign In to add comment