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
相关产品推荐
相关产品推荐

