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
相关产品推荐
相关产品推荐

