MongoDB聚合管道内迭代实现多测试用例批量统计
MongoDB一次性统计所有测试用例的聚合方案
针对你的场景,无需循环调用聚合管道,通过以下聚合步骤可一次性统计所有测试用例的结果,大幅提升效率:
核心思路
将每个文档中testResults的键值对结构转为数组,展开后按测试名称分组统计,最后计算通过率。
完整聚合管道代码
result = list(mycol.aggregate([ # 把testResults对象转换为键值对数组,每个元素格式为{ k: "test_1", v: 1 } { "$project": { "tests": {"$objectToArray": "$testResults"} } }, # 展开数组,让每个测试用例成为独立的文档 {"$unwind": "$tests"}, # 按测试名称分组,统计通过数和总文档数 { "$group": { "_id": "$tests.k", "pass": {"$sum": "$tests.v"}, "count": {"$sum": 1} } }, # 计算通过率,同时处理总文档数为0的边界情况(避免除法错误) { "$addFields": { "passRate": { "$cond": [ {"$eq": ["$count", 0]}, 0, {"$divide": ["$pass", "$count"]} ] } } } ]))
步骤说明
- $project + $objectToArray:将嵌套的
testResults对象转为数组结构,把每个测试用例的名称和结果拆分为k(测试名)和v(0/1结果)字段。 - $unwind:将数组展开,每个测试用例对应一条临时文档,为后续按测试名分组做准备。
- $group:以测试名为分组键,累加所有文档中该测试的通过数(
$sum "$tests.v")和总次数($sum 1)。 - $addFields:计算通过率,通过
$cond处理总次数为0的情况,避免出现除以0的错误。
优势
这个方案仅需对集合进行一次全量扫描,无需循环调用N次聚合,避免了多次网络请求和数据库重复计算,对于10万条文档的场景,性能远优于循环方案。
内容的提问来源于stack exchange,提问作者SC990987
相关产品推荐
相关产品推荐

