MongoDB条件聚合查询需求:按门店与KPI类型统计计数总和
MongoDB聚合查询实现:按指定storeCode和kpiType统计计数器总和
完整聚合查询代码
MongoDB Shell 版本
db.SensorData.aggregate([ // 过滤符合指定storeCode和kpiType组合的文档 { $match: { $or: [ { storeCode: "111", kpiType: "trafficIn" }, { storeCode: "222", kpiType: "trafficOut" } ] } }, // 根据kpiType动态提取对应的计数值 { $addFields: { count: { $switch: { branches: [ { case: { $eq: ["$kpiType", "trafficIn"] }, then: "$trafficIn.countValue" }, { case: { $eq: ["$kpiType", "trafficOut"] }, then: "$trafficOut.countValue" } ], default: 0 // 兼容未定义的kpiType,避免计算报错 } } } }, // 按storeCode和kpiType分组求和 { $group: { _id: { storeCode: "$storeCode", kpiType: "$kpiType" }, sum: { $sum: "$count" } } } ])
Node.js 版本(适配给定的conditions变量)
const conditions = [ { storeCode: "111", kpiType: "trafficIn" }, { storeCode: "222", kpiType: "trafficOut" } ]; const result = await db.collection("SensorData").aggregate([ { $match: { $or: conditions } }, { $addFields: { count: { $switch: { branches: [ { case: { $eq: ["$kpiType", "trafficIn"] }, then: "$trafficIn.countValue" }, { case: { $eq: ["$kpiType", "trafficOut"] }, then: "$trafficOut.countValue" } ], default: 0 } } } }, { $group: { _id: { storeCode: "$storeCode", kpiType: "$kpiType" }, sum: { $sum: "$count" } } } ]).toArray();
各阶段说明
- $match 阶段:通过
$or匹配所有目标storeCode和kpiType的组合,先过滤无关文档,减少后续计算的数据量,提升查询效率。 - $addFields 阶段:因为不同
kpiType的计数值存放在不同嵌套字段中,用$switch根据kpiType动态提取对应countValue,统一存入count字段,简化后续聚合逻辑。 - $group 阶段:以
storeCode和kpiType的组合作为分组键,用$sum对每个分组的count字段求和,得到每个组合的总计数。
查询结果
执行上述聚合后,将得到与需求完全匹配的结果:
[ { "_id": { "storeCode": "111", "kpiType": "trafficIn" }, "sum": 3 }, { "_id": { "storeCode": "222", "kpiType": "trafficOut" }, "sum": 4 } ]
内容的提问来源于stack exchange,提问作者StormTrooper
相关产品推荐
相关产品推荐

