MongoDB每天从数组中获取一个计数

时间:2015-01-23 20:06:36

标签: mongodb

我有一个(简化的)Json文档,格式如下:

{
    "_id" : ObjectId("54c29904e4b039512fc268b1"),
    "type" : "build",
    "time" : ISODate("2015-01-23T18:54:45.378Z"),
    "data" : {
            "buildNumber" : 228,
            "buildResult" : "FAILURE",
            "committers" : [
                    {
                            "name" : "Mike Smith"
                    }
            ]
    }
}

对于data.buildResult中具有FAILURE状态的所有文档,我想计算一个提交者已经提交代码的次数,导致给定月份的构建失败。例如,我想看到如下内容:

Feb - Mike Smith - 20
Feb - Jane Smith - 15
Feb - John Doe   -  5
Mar - Mike Smith - 10

我的查询如下:

db.builds.aggregate([
    { $match: { "data.buildResult": "FAILURE", "data.committers.name" : { $exists : true }  } },
    { $group: { 
        _id: { 
            month: { $month: "$time" },
            name: "$data.committers.name", 
        },
        count: { $sum: 1 }
    } },

    { $sort: { "count": 1} }
])

这将返回如下结果:

{ "_id" : { "month" : 1, "name" : [ "Mike Smith" ] }, "count" : 1 }
{ "_id" : { "month" : 1, "name" : [ "Mike Smith", "Jane Smith" ] }, "count" : 3 }

不是我想要的

1 个答案:

答案 0 :(得分:2)

您需要$unwindcommitters数组放入单独的文档中,以便在$group中单独计算:

db.builds.aggregate([
    { $match: { "data.buildResult": "FAILURE", "data.committers.name": { $exists: true } } },
    { $unwind: '$data.committers' },
    { $group: { 
        _id: { 
            month: { $month: "$time" },
            name: "$data.committers.name", 
        },
        count: { $sum: 1 }
    } },
    { $sort: { "count": 1} }
])

其中输出如下:

{
    "_id" : {
        "month" : 1,
        "name" : "Jane Smith"
    },
    "count" : 1
}, 
{
    "_id" : {
        "month" : 1,
        "name" : "Mike Smith"
    },
    "count" : 1
}