如何在MongoDB聚合中补全不存在的CRUD操作分组?
MongoDB补全缺失CRUD操作分组的统计方案
要补全未执行过的CRUD操作统计项,核心思路是先构造包含所有CRUD操作的基准集合,再和用户的实际操作统计做关联匹配,自动填充缺失项的默认值。完整聚合脚本如下:
db.collection.aggregate([ // 1. 统计每个用户每种操作的实际次数和最后执行时间 { $group: { _id: { userId: "$userId", operation: "$operation" }, count: { $sum: 1 }, last: { $max: "$timestamp" } } }, // 2. 将同一用户的所有操作统计合并为数组 { $group: { _id: "$_id.userId", userOps: { $push: { operation: "$_id.operation", count: "$count", last: "$last" } } } }, // 3. 预定义所有CRUD操作,补全缺失项 { $project: { _id: 0, userId: "$_id", operations: { $map: { input: ["create", "read", "update", "delete"], as: "op", in: { $mergeObjects: [ { operation: "$$op", count: 0, last: null }, { $arrayElemAt: [ { $filter: { input: "$userOps", cond: { $eq: ["$$this.operation", "$$op"] } } }, 0 ] } ] } } } } } ])
各阶段说明:
- 第一阶段$group:按用户ID+操作类型分组,计算每种操作的执行次数(
$sum:1)和最后执行时间($max取最新时间戳)。 - 第二阶段$group:把同一用户的所有操作统计结果合并成数组,方便后续和预定义操作列表匹配。
- 第三阶段$project:
- 用
$map遍历预定义的4种CRUD操作; - 每个操作先以默认值(count:0, last:null)初始化;
- 用
$filter从用户实际操作数组中匹配对应项,通过$mergeObjects覆盖默认值——如果用户没执行过该操作,就保留默认的0和null。
- 用
最终输出结果里,每个用户的4种CRUD操作都会完整展示,无论是否执行过。
内容的提问来源于stack exchange,提问作者Михаил Гусев
相关产品推荐
相关产品推荐

