You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB/Mongoose聚合查询返回求和值问题求助

活动报名时段人数校验解决方案

1. 修正聚合查询,获取指定时段总人数

你的聚合查询缺少指定时段过滤和异步结果处理,以下是修正后的函数,可返回指定时段的总报名人数:

async function getTotalPeopleByTime(targetTime) {
  // 聚合查询:先匹配指定时段,再求和同行人数
  const aggregateResult = await Note.aggregate([
    { $match: { time: targetTime } }, // 只筛选目标时段的报名记录
    { $group: { _id: null, total: { $sum: "$people" } } }
  ]);
  
  // 若该时段无报名记录,返回0;否则返回求和结果
  return aggregateResult.length > 0 ? aggregateResult[0].total : 0;
}

2. 完整报名控制逻辑

结合人数校验,编写处理用户报名的核心逻辑:

// 定义时段人数上限(可根据需求调整)
const MAX_TIME_SLOT_CAPACITY = 50;

async function processRegistration(registrationInfo) {
  const { lastname, people, email, time } = registrationInfo;

  // 先获取当前时段已报名总人数
  const currentTotal = await getTotalPeopleByTime(time);

  // 校验是否超过人数上限
  if (currentTotal + people > MAX_TIME_SLOT_CAPACITY) {
    return {
      success: false,
      msg: `抱歉,${time}点时段已达人数上限(${MAX_TIME_SLOT_CAPACITY}人),无法完成报名`
    };
  }

  // 校验通过,创建新报名记录
  try {
    const newRegistration = new Note({
      lastname,
      people,
      email,
      time
    });
    await newRegistration.save();
    return { success: true, msg: "报名成功!" };
  } catch (err) {
    return { success: false, msg: "报名失败,请稍后重试" };
  }
}

关键说明

  • $match 阶段:只筛选目标时段的记录,避免计算所有时段的总和,提升查询效率
  • 聚合结果处理:aggregate() 返回的是数组,需通过 result[0].total 提取求和值,无记录时返回0
  • 异步处理:必须用 await 等待聚合查询和数据保存的异步操作完成
  • 人数校验逻辑:需将新报名的同行人数加到当前总人数中,判断是否超出上限

内容的提问来源于stack exchange,提问作者Dave90

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 14:20:48