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

如何在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,提问作者Михаил Гусев

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:15:38