2015-08-26 53 views
1

我有一個數據如下聚合框架:

{ 
    "_id" : ObjectId("55d4410544c96d6f6578f893"), 
    "executionProject" : "Project1", 
    "suiteList" : [ 
     { 
      "suiteName": "Suite1", 
      "suiteStatus" : "PASS", 
     }, 
     { 
      "suiteName": "Suite2", 
      "suiteStatus" : "FAIL", 
     }, 
     { 
      "suiteName": "Suite3", 
      "suiteStatus" : "PASS", 
     } 
    ], 
    "runEndTime" : ISODate("2015-08-19T08:40:47.049Z") 
} 

{ 
    "_id" : ObjectId("55d4410544c96d6f6578f894"), 
    "executionProject" : "Project1", 
    "suiteList" : [ 
     { 
      "suiteName": "Suite1", 
      "suiteStatus" : "PASS", 
     }, 
     { 
      "suiteName": "Suite2", 
      "suiteStatus" : "FAIL", 
     }, 
     { 
      "suiteName": "Suite3", 
      "suiteStatus" : "FAIL", 
     } 
    ], 
    "runEndTime" : ISODate("2015-08-19T08:50:47.049Z") 
} 

我試圖得到的結果是這樣的:

{ 
    "executionProject": "Project1", 
    "data": [ 
     { 
      "date": "2015-08-19 08:40:47", 
      "suitePass": 2, 
      "suiteFail": 1 
     }, 
     { 
      "date": "2015-08-19 08:50:47", 
      "suitePass": 1, 
      "suiteFail": 2 
     } 
    ] 
} 

這裏我試圖按executionProject進行分組,並將runEndTimesuites的通過和失敗計數推送到結果。

我想這一點,但給我的投影走錯了路:

db.testruns.aggregate([ 
    { 
     $project: { 
      executionProject: "$executionProject", 
      runEndTime: "$runEndTime", 
      suiteList: "$suiteList" 
     } 
    }, 
    { 
     $unwind: "$suiteList" 
    }, 
    { 
     $group: { 
      _id: "$executionProject", 
      runEndTime: { 
       $addToSet: "$runEndTime" 
      }, 
      suite_pass: { 
       $sum: { 
        $cond: { 
         "if": { 
          $eq: ["$suiteList.suiteStatus", "PASS"] 
         }, 
         "then": 1, 
         "else": 0 
        } 
       } 
      } 
     } 
    }, 
    { 
     $group: { 
      _id: "$_id", 
      runEndTime: { $push: {runTime: "$runEndTime", suite_pass: "$suite_pass"} } 
     } 
    }, 
    { 
     $project: { 
      executionProject: "$_id", 
      runEndTime: "$runEndTime", 
      _id: 0 
     } 
    } 
]); 

回答

1

首先,你需要組由文檔來獲取一套總額,然後添加到陣列作爲你組上項目。另外不要忘了「之類的」,如果你想爲了事情:

[ 
     { "$unwind": "$suiteList" }, 
     { "$group": { 
     "_id": "$_id", 
     "executionProject": { "$first": "$executionProject" }, 
     "suite-pass": { 
      "$sum": { 
      "$cond": [ 
       { "$eq": [ "$suiteList.suiteStatus", "PASS" ] }, 
       1, 
       0 
      ] 
      } 
     }, 
     "suite-fail": { 
      "$sum": { 
      "$cond": [ 
       { "$eq": [ "$suiteList.suiteStatus", "FAIL" ] }, 
       1, 
       0 
      ] 
      } 
     }, 
     "date": { "$first": "$runEndTime" } 
     }}, 
     { "$sort": { "executionProject": 1, "date": 1 } }, 
     { "$group": { 
     "_id": "$executionProject", 
     "data": { 
      "$push": { 
      "suite-pass": "$suite-pass", 
      "suite-fail": "$suite-fail", 
      "date": "$date" 
      } 
     } 
     }} 
    ] 

產地:

{ 
    "_id" : "Project1", 
    "data" : [ 
      { 
        "suite-pass" : 2, 
        "suite-fail" : 1, 
        "date" : ISODate("2015-08-19T08:40:47.049Z") 
      }, 
      { 
        "suite-pass" : 1, 
        "suite-fail" : 2, 
        "date" : ISODate("2015-08-19T08:50:47.049Z") 
      } 
    ] 
} 
+0

布雷克,你是救世主的人。我想更多地瞭解你。你爲什麼不寫博客或關於高級聚合的文章? –