如何使用Mongo聚合特性来计算嵌套组的总计和小计百分比?

问题描述:

我有这样的mongo集合中的一些文档。如何使用Mongo聚合特性来计算嵌套组的总计和小计百分比?

{ 
    "_id" : ObjectId("57e290087139be15d59408c1"), 
    "groupName" : "Registration", 
    "testCases" : [ 
     { 
      "name" : "R1", 
      "browser" : "Chrome", 
      "status" : "passed" 
     }, 
     { 
      "name" : "R1.1", 
      "browser" : "Chrome", 
      "status" : "passed" 
     }, 
     { 
      "name" : "R2", 
      "browser" : "Chrome", 
      "status" : "passed" 
     }, 
     { 
      "name" : "R3", 
      "browser" : "Chrome", 
      "status" : "passed" 
     }, 
     { 
      "name" : "R4", 
      "browser" : "Chrome", 
      "status" : "passed" 
     }, 
     { 
      "name" : "R1", 
      "browser" : "Firefox", 
      "status" : "passed" 
     }, 
     { 
      "name" : "R2", 
      "browser" : "Firefox", 
      "status" : "passed" 
     }, 
     { 
      "name" : "R3", 
      "browser" : "Firefox", 
      "status" : "passed" 
     }, 
     { 
      "name" : "R4", 
      "browser" : "Firefox", 
      "status" : "failed" 
     } 
    ] 
} 

    { 
    "_id" : ObjectId("57e2903b7139be15d59408c2"), 
    "groupName" : "Checkout", 
    "testCases" : [ 
     { 
      "name" : "C1", 
      "browser" : "Chrome", 
      "status" : "passed" 
     }, 
     { 
      "name" : "C2", 
      "browser" : "Chrome", 
      "status" : "passed" 
     }, 
     { 
      "name" : "C3", 
      "browser" : "Chrome", 
      "status" : "failed" 
     }, 
     { 
      "name" : "C4", 
      "browser" : "Chrome", 
      "status" : "passed" 
     }, 
     { 
      "name" : "C1", 
      "browser" : "Firefox", 
      "status" : "passed" 
     }, 
     { 
      "name" : "C2", 
      "browser" : "Firefox", 
      "status" : "passed" 
     }, 
     { 
      "name" : "C3", 
      "browser" : "Firefox", 
      "status" : "passed" 
     }, 
     { 
      "name" : "C4", 
      "browser" : "Firefox", 
      "status" : "failed" 
     } 
    ] 
} 

如何使用Mongo的聚合特性来计算嵌套组的总计和小计百分比?

我期待着与结果的输出作为

例预期输出

results: [  
    { 
     "groupName": "Registration", 
     "totalTests": 17, 
     "section": [ 
      { "name": "R1", "totalTests": 17, "sectionCount": 2 } 
     ] 
    } 
] 

你可以试着运行下面的聚合操作:

db.collection.aggregate([ 
    { "$unwind": "$testCases" }, 
    { 
     "$group": { 
      "_id": null, 
      "testsCount": { "$sum": 1 }, 
      "docs": { "$push": "$$ROOT" } 
     } 
    }, 
    { "$unwind": "$docs" }, 
    { 
     "$group": { 
      "_id": { 
       "groupName": "$docs.groupName", 
       "testName": "$docs.testCases.name" 
      }, 
      "count": { "$sum": 1 }, 
      "testsCount": { "$first": "$testsCount" } 
     } 
    },  
    { 
     "$group": { 
      "_id": "$_id.groupName", 
      "totalTests": { "$first": "$testsCount" }, 
      "section": { 
       "$push": { 
        "name": "$_id.testName", 
        "totalTests": "$testsCount", 
        "sectionCount": "$count" 
       } 
      } 
     } 
    } 
]) 
+1

感谢Chridam。我从来不知道有几个关键字可以帮助像$$ ROOT,$ push,$ first这样的集合函数。再次感谢您在此展示灯光。 现在我的查询已经从100多行代码减少到40以下。 – Nirmal