我有以下MongoDB查询,按日期和结果分组并给出计数。我希望查询还为特定日期返回0,如果当天不存在数据,则返回结果。
例如,我有以下结果状态:SUCCESS和FAILED。如果在21日没有失败的结果我想要一个返回0的计数:
{
"_id" : {
"month" : 1,
"day" : 21,
"year" : 2014,
"buildResult" : "FAILURE"
},
"count" : 0
}
我已经使用关系数据库和日历表做了类似的事情,但我不确定如何使用MongoDB来解决这个问题。这是可能的,还是应该在运行查询后以编程方式执行某些操作?
以下是数据库中文档(简化)的示例:
{
"_id" : ObjectId("52deab2fe4b0a491abb54108"),
"type" : "build",
"time" : ISODate("2014-01-21T17:15:27.471Z"),
"data" : {
"buildNumber" : 43,
"buildDuration" : 997308,
"buildResult" : "SUCCESS"
}
}
这是我当前的查询:
db.builds.aggregate([
{ $match: { "data.buildResult" : { $ne : null} }},
{ $group: {
_id: {
month: { $month: "$time" },
day: { $dayOfMonth: "$time" },
year: { $year: "$time" },
buildResult: "$data.buildResult",
},
count: { $sum: 1}
} },
{ $sort: { "_id.year": 1, "_id.month": 1, "_id.day": 1} }
])
答案 0 :(得分:1)
如果我正确理解你想要什么,你可以试试这个:
db.builds.aggregate([
{ $project:
{
time: 1,
projectedData: { $ifNull: ['$data.buildResult', 'none'] }
}
},
{ $group: {
_id: {
month: { $month: "$time" },
day: { $dayOfMonth: "$time" },
year: { $year: "$time" },
buildResult: "$projectedData"
},
count: { $sum: { $cond: [ { $eq: [ "$projectedData", "none" ] }, 0, 1 ] } }
} },
{ $sort: { "_id.year": 1, "_id.month": 1, "_id.day": 1 } }
])
<强>更新强>
您希望从输出中获取更多输入文档,只有unwind
运算符可以使用数组,但是您没有任何数组,因此我知道不可能在您的文档中获取更多文档案件。所以你应该在查询结果之后添加一些逻辑来为现有日期创建新数据,为另一种类型的buildResult创建0计数......