MongoDB聚合管道末尾统计结果大于0的文档数及游标疑问
当然可以在聚合管道里完成统计,不用手动遍历游标!
完全没问题,你直接把统计逻辑加到聚合管道的最后一步就行,MongoDB提供了专门的聚合阶段来做这个,比自己遍历游标高效多了。
方法一:用$match + $count(最简洁)
先通过$match过滤出result大于0的文档,再用$count直接统计数量,示例代码如下:
db.yourCollection.aggregate([ // 这里放你已有的聚合步骤,最后得到只包含result字段的文档 { $match: { result: { $gt: 0 } } }, // 筛选result>0的文档 { $count: "positive_result_count" } // 统计数量,字段名可以自定义 ])
执行后,你会得到一个只含统计结果的文档(比如{ "positive_result_count": 2 },对应你示例里的result:1和result:3)。关于返回值:这个聚合仍然会返回游标,只不过游标里只有这一个统计文档,你可以通过next()直接取出结果。
方法二:用$group + $sum(适合后续继续聚合)
如果之后还想对统计结果做更多操作,可以用$group配合条件求和的方式,把统计逻辑整合到分组里:
db.yourCollection.aggregate([ // 你已有的聚合步骤 { $group: { _id: null, // 将所有文档归为同一组 positive_result_count: { $sum: { $cond: [{ $gt: ["$result", 0] }, 1, 0] } // 符合条件加1,否则加0 } } } ])
这种方式返回的也是游标,里面包含一个带有统计值的文档,好处是你可以在这个$group之后再加其他聚合阶段,继续处理数据。
为什么推荐这么做?
把统计放到聚合管道里,是让MongoDB服务器端直接完成计算,避免把大量数据传到客户端再遍历计数,性能会好很多,尤其是数据量很大的时候。
内容的提问来源于stack exchange,提问作者Ohad
相关产品推荐
相关产品推荐

