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

MongoDB聚合:按用户与表单分组并实现数据透视

MongoDB聚合实现用户+标题分组并透视日期统计提交次数

完全可以仅通过MongoDB Aggregation实现需求,无需后续JavaScript处理,核心是利用$group做多层分组,再结合$arrayToObject和$mergeObjects完成透视转换。

示例文档结构

{
  username: "alice",
  title: "Report A",
  submitDate: ISODate("2024-05-01T00:00:00Z")
  // 其他业务字段
}

完整聚合查询

db.collection.aggregate([
  // 1. 按「用户-标题-格式化日期」分组,统计提交次数
  {
    $group: {
      _id: {
        username: "$username",
        title: "$title",
        date: { $dateToString: { format: "%Y-%m-%d", date: "$submitDate" } }
      },
      submitCount: { $sum: 1 }
    }
  },
  // 2. 按「用户-标题」聚合,将每个日期和对应的次数整理为键值对数组
  {
    $group: {
      _id: { username: "$_id.username", title: "$_id.title" },
      dateCounts: {
        $push: {
          k: "$_id.date", // 作为目标对象的键
          v: "$submitCount" // 作为目标对象的值
        }
      }
    }
  },
  // 3. 将键值对数组转为动态字段,同时保留用户和标题信息
  {
    $replaceRoot: {
      newRoot: {
        $mergeObjects: [
          { username: "$_id.username", title: "$_id.title" },
          { $arrayToObject: "$dateCounts" }
        ]
      }
    }
  }
])

预期输出示例

{
  "username": "alice",
  "title": "Report A",
  "2024-05-01": 3,
  "2024-05-02": 2,
  "2024-05-03": 1
}

注意事项

  • 日期格式可通过修改$dateToString的format参数调整,比如"%Y/%m/%d"
  • 若需要补全用户+标题组合中无提交记录的日期,需额外结合$range生成日期序列并做左连接,常规场景下无需此操作

内容的提问来源于stack exchange,提问作者JS24

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:01:06