MongoDB聚合查询需求:按服务器分组统计Running状态文档数
解决MongoDB按服务器统计Running状态文档数的问题
你当前的聚合查询只完成了过滤和字段投影,缺少分组统计的阶段,所以会返回所有符合条件的单条文档。要实现按服务器分组计数,需要在聚合管道中添加$group阶段,优化后的查询如下:
db["server-status"].aggregate([ // 第一步:先过滤出状态为Running的文档,减少后续处理数据量 { $match: { status: "Running" } }, // 第二步:按主机名和状态分组,统计每组的文档数量 { $group: { _id: { host: "$host", status: "$status" }, count: { $sum: 1 } } }, // 可选:调整输出格式,让结果更直观(去掉_id嵌套,直接展示字段) { $project: { _id: 0, host: "$_id.host", status: "$_id.status", count: 1 } } ])
各阶段说明:
$match:优先过滤出status: "Running"的文档,避免对无关数据进行后续处理,提升查询性能。$group:以host和status作为分组依据(因为所有文档状态都是Running,也可以只按host分组),用$sum:1统计每组的文档数量,每匹配到一个文档计数加1。$project:将_id中的嵌套字段展开,去掉默认的_id字段,输出你需要的host、status、count三个字段,结果格式更贴合需求。
查询结果示例:
{ "host" : "SERVER1", "status" : "Running", "count" : 4 } { "host" : "SERVER3", "status" : "Running", "count" : 2 }
如果不需要显式输出status字段(因为已经过滤为Running),可以简化$group和$project阶段:
db["server-status"].aggregate([ { $match: { status: "Running" } }, { $group: { _id: "$host", count: { $sum: 1 } } }, { $project: { _id: 0, host: "$_id", status: "Running", count: 1 } } ])
内容的提问来源于stack exchange,提问作者wiTTyMinds Technology
相关产品推荐
相关产品推荐

