You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"]}
                ]
            }
        }
    }
]))

步骤说明

  1. $project + $objectToArray:将嵌套的testResults对象转为数组结构,把每个测试用例的名称和结果拆分为k(测试名)和v(0/1结果)字段。
  2. $unwind:将数组展开,每个测试用例对应一条临时文档,为后续按测试名分组做准备。
  3. $group:以测试名为分组键,累加所有文档中该测试的通过数($sum "$tests.v")和总次数($sum 1)。
  4. $addFields:计算通过率,通过$cond处理总次数为0的情况,避免出现除以0的错误。

优势

这个方案仅需对集合进行一次全量扫描,无需循环调用N次聚合,避免了多次网络请求和数据库重复计算,对于10万条文档的场景,性能远优于循环方案。

内容的提问来源于stack exchange,提问作者SC990987

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 01:52:05