MongoDB聚合实现按日期统计客户状态计数
按日期统计MongoDB文档状态的键值对计数
针对你需要按日期统计客户状态数量,并直接输出键值对格式结果的需求,可以通过以下聚合管道实现,所有计算在数据库端完成,避免客户端处理的性能损耗:
完整聚合语句
db.collection.aggregate([ // 1. 按日期+状态联合分组,统计每个组合的出现次数 { $group: { _id: { day: { $dateToString: { format: "%Y-%m-%d", date: "$date" } }, status: "$status" }, count: { $sum: 1 } } }, // 2. 按日期重新分组,将状态与计数整理为键值对数组 { $group: { _id: "$_id.day", type: { $push: { k: "$_id.status", v: "$count" } } } }, // 3. 将键值对数组转换为目标对象格式 { $addFields: { type: { $arrayToObject: "$type" } } } ])
各阶段说明
- 第一阶段
$group:以格式化后的日期和状态作为联合分组键,统计每个组合的文档数量,输出结构类似:{ "_id": { "day": "2022-12-01", "status": "activate" }, "count": 2 } - 第二阶段
$group:按日期重新聚合,将每个状态的名称(k)和计数(v)存入type数组,输出结构类似:{ "_id": "2022-12-01", "type": [ { "k": "activate", "v": 2 } ] } - 第三阶段
$addFields:使用$arrayToObject将数组转换为键值对对象,得到最终需要的格式。
输出结果
针对你的示例数据,执行后会得到:
[ { "_id": "2022-12-01", "type": { "activate": 2 } }, { "_id": "2022-12-02", "type": { "deactivate": 1 } }, { "_id": "2022-12-21", "type": { "deactivate": 1 } } ]
内容的提问来源于stack exchange,提问作者Lahiru Supun
相关产品推荐
相关产品推荐

