MongoDB随时间推移的累积分组

时间:2019-08-15 20:13:30

标签: mongodb aggregation-framework

好,所以我想按日期(月/年)来获取添加的项目类型的累积计数

我能够按月/年进行分组并键入...我的数字(总和)为我提供了该月的计数...但是之后我是那个月加上之前的所有月份...

这是我到目前为止所拥有的

Things.aggregate([
    {
        $match: {
            'dates.added': {
                $ne: null
            }
        }
    },
    {
        $group: {
            _id: {
            year: {
                $year: '$dates.added'
            },
            month: {
                $month: '$dates.added'
            },
            type: '$type'
            },
        }
    },
    {
        $sort: {
            '_id.year': -1,
            '_id.month': -1,
            '_id.type': 1
        }
    },
    {
        $limit: 100,
    },
])

产生这样的结果

{
    "_id" : {
        "year" : 2018,
        "month" : 9,
        "type" : "Train"
    },
    "number" : 1.0
}

{
    "_id" : {
        "year" : 2018,
        "month" : 9,
        "type" : "Car"
    },
    "number" : 1.0
}


{
    "_id" : {
        "year" : 2018,
        "month" : 9,
        "type" : "Boat"
    },
    "number" : 1.0
}

{
    "_id" : {
        "year" : 2018,
        "month" : 8,
        "type" : "Car"
    },
    "number" : 2.0
}

{
    "_id" : {
        "year" : 2018,
        "month" : 8,
        "type" : "Boat"
    },
    "number" : 2.0
}

{
    "_id" : {
        "year" : 2018,
        "month" : 8,
        "type" : "Train"
    },
    "number" : 1.0
}

或者换一种说法:

        Aug-18      Sep-18
Boat:   2           1
Car:    2           1
Train:  1           1

但是我想说的是(累积的)

        Aug-18      Sep-18
Boat:   2           3
Car:    2           3
Train:  1           2

1 个答案:

答案 0 :(得分:0)

  • 添加一个$project阶段和项目年份,类型和月份,但对于月份,请使用$range输出一个数组,其中包含从实际月份到年底的所有月份。
  • $unwind月份数组
  • $group按年份,月份和类型输入并使用$sum

聚合管道:

Things.aggregate([
    {
        $match: {
            'dates.added': {
                $ne: null
            }
        }
    },{
        $project: {
            year: {
                $year: '$dates.added'
            },
            month: {
                $range: [ { "$month" : '$dates.added'}  , 13 ]
            },
            type: '$type'
        }
    },{
        $unwind: "$month",
    },{
        $group: {
            _id: {
                year:"$year",
                month: "$month",
                type: '$type'
            },
            number : { $sum : 1 }
        }
    },{
        $sort: {
            '_id.year': -1,
            '_id.month': -1,
            '_id.type': 1
        }
    },{
        $limit: 100,
    },
])