首页 文章

MongoDB聚合组和计数字符串

提问于
浏览
1

从我的集合中计算不同的LogStatusses时遇到问题 . 我想从查询中得到以下结果:

月| ImporterName | NrOfError | NrOfDebug | NrOfInfo | NrOfWarning

因此,这包括按Month和ImporterName分组并计算具有不同状态的文档数 .

我的MongoDB系列:

{
    "_id" : "8ec84cb7-5099-4a9d-be00-a40200a67c5a",
    "Messages" : [
        {
            "LogStatus" : "Error",
            "Message" : "My test message"
        },
        {
            "LogStatus" : "Error",
            "Message" : "My test message"
        },
        {
            "LogStatus" : "Error",
            "Message" : "My test message"
        },
        {
            "LogStatus" : "Error",
            "Message" : "My test message"
        },
        {
            "LogStatus" : "Error",
            "Message" : "My test message"
        }
    ],
    "StartTime" : new Date("2014-12-15T10:06:09.00Z"),
    "EndTime" : new Date("2014-12-15T13:06:09.00Z"),
    "HasErrors" : true,
    "HasWarnings" : false,
    "ImporterName" : "MyImporter"
}

我已经有以下查询:

db.SessionLogItems.aggregate
([
{
    $project:
    {
        month :{$month : "$StartTime"},
        name: "$ImporterName",
        status: "$Messages.LogStatus", 
        _id: 0
    }
}
])

结果:

月份:12,“名称”:“importername”,状态:[“错误”,“错误”,“信息”]

db.SessionLogItems.aggregate
([
{ 
    $unwind: "$Messages" 
}, 
{
    $group: { _id: "$Messages", Number : {$sum : 1 }}
}, 
{
    $sort: {Number : -1 }
} 
])

结果:“_ id”:{“LogStatus”:“警告”,“消息”:“我的测试警告”},“数字”:5“_id”:{“LogStatus”:“错误”,“消息”:“我的测试消息“},”数字“:5

但我似乎无法弄清楚正确的查询 . 任何帮助表示赞赏!

编辑:

我上面的例子只是众多文件中的一个 . 我有几个有startTime和EndTime的导入器 . 导入器有几个logmessages和四个可能的LogStatusses:“Error”,“Info”,“Debug”,“Warning” . 我想每个月和每个进口商概述他们产生了多少错误,信息,调试和警告 .

1 回答

  • 1

    假设您的"month"在 StartTimeEndTime 值之间没有重叠,那么您可以简单地使用 StartTime 值作为分组键的基础 . 你的其他"fields"的大部分魔力来自$cond运算符,它决定是否计算值:

    db.SessionLogItems.aggregate([
    
        // Unwind the array to de-normalize the documents contained
        { "$unwind": "$Messages" },
    
        // Month and Importer form the grouping key
        { "$group": {
            "_id": { 
                "month": { "$month": "$StartTime" },
                "ImporterName": "$ImporterName"
            },
            "NrOfError": {
               "$sum": {
                   "$cond": [
                       { "$eq": [ "$Messages.LogStatus", "Error" ] },
                       1,
                       0
                    ]
                }
            },
            "NrOfDebug": {
               "$sum": {
                   "$cond": [
                       { "$eq": [ "$Messages.LogStatus", "Debug" ] },
                       1,
                       0
                    ]
                }
            },
            "NrOfInfo": {
               "$sum": {
                   "$cond": [
                       { "$eq": [ "$Messages.LogStatus", "Info" ] },
                       1,
                       0
                    ]
                }
            },
            "NrOfWarning": {
               "$sum": {
                   "$cond": [
                       { "$eq": [ "$Messages.LogStatus", "Warning" ] },
                       1,
                       0
                    ]
                }
            }
        }}
    ])
    

    因此,基本上测试“状态”值以及匹配与否的位置,然后将适当的计数值添加到适当的字段 .

相关问题