聚合查询中的Sum数组

时间:2014-07-22 08:13:27

标签: mongodb mongodb-query aggregation-framework

我对MongoDB很新,并且在我想要的时候遇到一些问题。这些文件包含"错误"发生在特定时间的事情。我想从查询中得到的结果是每个用户每个月的错误计数。我已经想到了,但另外我想要每个用户的总错误数。

这是我到目前为止所得到的:

    db.Logger.aggregate([
        { "$group": {
            "_id": {
                "name": "$name",
                "month": { "$month": "$errorTime" }
            },
            "totalErrors": { "$sum": 1 }
        }},
        { $group : 
            { _id: { name : "$_id.name"},
                errors: { $addToSet: { totalErrors: { errorsThisMonth: "$totalErrors", currentMonth : "$_id.month" } } },
            }
        }

])

结果是:

    {
        "_id" : {
            "name" : "abhos"
        },
        "errors" : [ 
            {
                "totalErrors" : {
                    "errorsThisMonth" : 6,
                    "currentMonth" : 2
                }
            }, 
            {
                "totalErrors" : {
                    "errorsThisMonth" : 6,
                    "currentMonth" : 1
                }
            }
        ]
    },

是否有可能通过添加到该查询来获得我想要的内容?

1 个答案:

答案 0 :(得分:0)

您需要的只是第二个$sum中的额外$group

    db.Logger.aggregate([
        { "$group": {
            "_id": {
                "name": "$name",
                "month": { "$month": "$errorTime" }
            },
            "totalErrors": { "$sum": 1 }
        }},
        { "$group": {
            "_id": "$_id.name",
            "errors": { 
                "$addToSet": { 
                    "errorsThisMonth": "$totalErrors",
                    "currentMonth" : "$_id.month" 
                } 
            },
            "totalErrors": { "$sum": "$totalErrors" }
        }}
])

此外,您还需要一些额外的文档级别,例如_id下的额外字段以及"错误" "设置"在分组中产生。没有这些额外的级别,这个输出稍有不同:

    {
        "_id": "abhos"
        "errors" : [ 
            {
                "errorsThisMonth" : 6,
                "currentMonth" : 2
            }, 
            {
                "errorsThisMonth" : 6,
                "currentMonth" : 1
            }
        ],
        "totalErrors": 12
    },