1

У меня есть некоторые документы в коллекции монго, подобные этому.Как использовать функцию агрегации 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" 
     } 
    ] 
} 

Как использовать совокупную функцию Монго для вычисления итогов и промежуточные итоги процентов с вложенными группами?

Я ожидаю выход с результатами,

Пример Ожидаемый выход:

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