[英]MongoDB aggregate return count of 0 if no results
我有以下MongoDB查詢按日期和結果分組並給出計數。 我希望查詢還為特定日期返回0,如果當天不存在數據,則返回結果。
例如,我有以下結果狀態:SUCCESS和FAILED。 如果在21日沒有FAILED的結果我想要一個返回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} }
])
如果我正確理解你想要什么,你可以試試這個:
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計數...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.