MongoDB聚合查询如何根据start变量动态添加match条件合并重复函数
实现方案
核心思路是先动态构建聚合管道数组,根据start参数是否存在决定是否追加时间过滤的$match阶段,后续公共聚合阶段直接统一拼接即可,无需维护两套重复逻辑。
第一步:合并为统一查询函数
function getSessionStats(start) { // 初始化聚合管道 const pipeline = []; // 仅当传入start时添加时间过滤条件 if (start) { pipeline.push({ $match: { startTime: { $gte: start } } }); } // 拼接所有公共聚合阶段 pipeline.push( { $group: { _id: { departament: "$departament", userAdName: "$userAdName" }, cleanTime: { $sum: { $subtract: ["$commonTime", "$idlingTime"] } } } }, { $group: { _id: { departament: "$_id.departament"}, users: { $push: {value: '$cleanTime', name: '$_id.userAdName'} }, commonCleanTime: { $sum: "$cleanTime" } } }, { $project: { departament: '$_id.departament', users: '$users', commonCleanTime: '$commonCleanTime', performance: { $divide: [ "$commonCleanTime", { $size: "$users" }] } } } ); return Sessions.aggregate(pipeline); }
第二步:简化调用逻辑
const start = lastDay ? getDateFromString(lastDay) : undefined; const groupedByUserSessions = await getSessionStats(start);
这种写法扩展性很强,后续如果需要新增其他动态过滤条件,只要按照相同逻辑往pipeline数组里追加对应阶段即可,所有公共逻辑只需要维护一处。
内容的提问来源于stack exchange,提问作者Alexander Laktionov
相关产品推荐
相关产品推荐

