在MongoDB中按日期汇总不同的等级

时间:2016-03-08 15:44:42

标签: mongodb aggregation-framework

我正在使用MongoDB网站上的餐馆数据集。文档包含如下数组:

{
    "grades" : [ 
        {
            "date" : ISODate("2014-06-10T00:00:00.000Z"),
            "grade" : "A"
        }, 
        {
            "date" : ISODate("2013-06-05T00:00:00.000Z"),
            "grade" : "B",
            "score" : 7
        }, 
        {
            "date" : ISODate("2012-04-13T00:00:00.000Z"),
            "grade" : "A"
        }, 
        {
            "date" : ISODate("2011-10-12T00:00:00.000Z"),
            "grade" : "A"
        }
    ]
}

我试图获取所有日期的列表,并计算当天每个年级的数量。

我到目前为止:

db.restaurants.aggregate([{
    $unwind : {
        path: '$grades'
    }
}, {
    $group: {
        _id: '$grades.date',
        grades: {
            $push: '$grades.grade'
        }
    }
}])

其中给出了该日期的每个日期和成绩。

我现在如何计算每个独特等级的数量?

1 个答案:

答案 0 :(得分:1)

感谢this question想出来。

解决方案实际上比我想象的要简单得多:

db.restaurants.aggregate([{
    $unwind : {
        path: '$grades'
    }
}, {
    $group: {
        _id: {
            date: '$grades.date',
            grade: '$grades.grade'
        },
        count: {
            $sum: 1
        }
    }
}])

这给出了如下结果:

/* 1 */
{
    "_id" : {
        "date" : ISODate("2014-06-23T00:00:00.000Z"),
        "grade" : "C"
    },
    "count" : 4
}

/* 2 */
{
    "_id" : {
        "date" : ISODate("2011-11-01T00:00:00.000Z"),
        "grade" : "C"
    },
    "count" : 3
}

/* 3 */
{
    "_id" : {
        "date" : ISODate("2014-05-06T00:00:00.000Z"),
        "grade" : "A"
    },
    "count" : 121
}

/* 4 */
{
    "_id" : {
        "date" : ISODate("2012-08-21T00:00:00.000Z"),
        "grade" : "C"
    },
    "count" : 5
}

/* 5 */
{
    "_id" : {
        "date" : ISODate("2013-09-04T00:00:00.000Z"),
        "grade" : "C"
    },
    "count" : 4
}