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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 11:15:05