MongoDB如何跨多集合聚合统计关联的活动记录总数?
实现方案
你可以直接在group_lists集合上执行以下聚合查询实现需求:
// 基础实现版本 db.group_lists.aggregate([ // 关联groups集合,获取当前group_list对应的所有分组 { $lookup: { from: "groups", localField: "_id", foreignField: "group_list_id", as: "related_groups" } }, // 展开分组数组,用于后续关联活动数据 { $unwind: { path: "$related_groups", preserveNullAndEmptyArrays: true } }, // 关联activities集合,获取每个分组对应的活动列表 { $lookup: { from: "activities", localField: "related_groups._id", foreignField: "group_id", as: "related_activities" } }, // 按group_list维度分组,统计总活动数 { $group: { _id: "$_id", title: { $first: "$title" }, total_activities: { $sum: { $size: "$related_activities" } } } }, // 可选:按_id升序排列,对齐示例输出顺序 { $sort: { _id: 1 } } ])
步骤说明
$lookup关联groups集合:将每个group_lists文档匹配到的关联分组存入related_groups数组$unwind拆分数组:将数组结构的关联分组拆分为单条数据,方便后续关联活动集合,preserveNullAndEmptyArrays参数保证没有关联分组的group_lists数据不会被过滤- 第二次
$lookup关联activities集合:拿到每个分组对应的所有活动存入related_activities数组 $group聚合统计:按group_lists的_id分组,保留原有title字段,累加所有分组的活动数量得到总活动数$sort可选排序:不需要对齐示例顺序可直接删除该阶段
高性能优化版本
数据量较大时推荐使用该方案,避免$unwind操作带来的性能损耗:
db.group_lists.aggregate([ { $lookup: { from: "groups", let: { gl_id: "$_id" }, pipeline: [ // 匹配当前group_list对应的分组 { $match: { $expr: { $eq: ["$group_list_id", "$$gl_id"] } } }, // 直接统计每个分组对应的活动数量 { $lookup: { from: "activities", localField: "_id", foreignField: "group_id", as: "acts" } }, { $project: { act_count: { $size: "$acts" }, _id: 0 } } ], as: "group_act_counts" } }, // 直接累加所有分组的活动数得到总数 { $project: { title: 1, total_activities: { $sum: "$group_act_counts.act_count" } } }, { $sort: { _id: 1 } } ])
内容的提问来源于stack exchange,提问作者drenl
相关产品推荐
相关产品推荐

