簡體   English   中英

如果沒有結果,MongoDB聚合返回計數為0

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM