【问题标题】:$push and $sum with the aggregation framework on sub-documents$push 和 $sum 与子文档上的聚合框架
【发布时间】:2015-08-26 10:00:55
【问题描述】:

我有一个数据如下:

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

【问题讨论】:

    标签: mongodb mongoose mongodb-query aggregation-framework


    【解决方案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")
                }
        ]
    }
    

    【讨论】:

    • 布莱克,你是个救世主。我想向你学习更多。你为什么不写一篇关于高级聚合的博客或文章?
    猜你喜欢
    • 1970-01-01
    • 2015-10-04
    • 2015-05-29
    • 2020-08-06
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 2012-04-20
    • 2021-02-01
    相关资源
    最近更新 更多