我有一个(简化的)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 }
不是我想要的
答案 0 :(得分:2)
您需要$unwind
将committers
数组放入单独的文档中,以便在$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
}