$push 和 $sum 与子文档上的聚合框架

$push and $sum with the aggregation framework on sub-documents

我有一个数据如下:

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

首先,您需要按文档分组以获得套件总数,然后在项目分组时添加到数组中。如果您想要按顺序排列,也不要忘记 "sort":

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