MongoDB Mongoose 关联两集合实现按月统计各套餐活跃订阅量
MongoDB 聚合查询补充实现方案
你当前已完成有效订阅过滤、套餐关联的逻辑,接下来需要补充5个聚合阶段即可实现目标格式的统计结果,完整聚合管道如下:
[ // 你已有的逻辑:过滤未到期的有效订阅 { "$match": { "$expr": { "$gt": ["$end_time", new Date()] } } }, // 你已有的逻辑:关联packages集合获取套餐信息 { "$lookup": { "from": "packages", "localField": "package", "foreignField": "_id", "as": "package" } }, // 新增1:展开lookup返回的package数组,每个订阅对应单条套餐数据 { "$unwind": "$package" }, // 新增2:提取订阅到期时间的月份字段,作为分组依据 { "$addFields": { "month": { "$month": "$end_time" } } }, // 新增3:按「月份+套餐名称」分组,统计每个分组的活跃订阅数 { "$group": { "_id": { "month": "$month", "package_name": "$package.package_name" }, "total_active": { "$sum": 1 } } }, // 新增4:按月份二次分组,将同月份所有套餐的统计结果聚合为数组 { "$group": { "_id": "$_id.month", "packages": { "$push": { "package_name": "$_id.package_name", "total_active": "$total_active" } } } }, // 新增5:调整输出字段格式,匹配目标结构 { "$project": { "_id": 0, "month": "$_id", "packages": 1 } } ]
补充说明(含0活跃套餐输出方案)
上述代码默认只会统计当月有活跃订阅的套餐,如果需要输出所有套餐(当月无活跃订阅的统计为0),可以在管道最开头加入全量套餐拉取、月份与套餐笛卡尔积的逻辑,再左关联上述统计结果补0即可。
内容的提问来源于stack exchange,提问作者alice
相关产品推荐
相关产品推荐

