1

我有這樣的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 } 
     ] 
    } 
] 

回答

1

你可以試着運行下面的聚合操作:

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