Mongodb在滚动窗口中计算不同的聚合

时间:2019-01-30 16:55:41

标签: mongodb aggregation-framework

我正在尝试在滚动窗口(例如, 30天。

该集合如下所示:

{ 
    "_id" : ObjectId("1xxx"), 
    "first_name" : "Dib", 
    "last_name"  : "Shabo",
    "_modified"  : "2019-01-24 2:00:00"
},
{ 
    "_id" : ObjectId("1yyy"), 
    "first_name" : "Jon", 
    "last_name"  : "Holmes",
    "_modified"  : "2019-01-24 15:23:11"
},
{ 
    "_id" : ObjectId("1zzz"), 
    "first_name" : "James", 
    "last_name"  : "Bently",
    "_modified"  : "2019-01-24 17:37:11"
},
{ 
    "_id" : ObjectId("1aaa"), 
    "first_name" : "Fred", 
    "last_name"  : "Gimbal",
    "_modified"  : "2019-01-22 15:37:11"
},
{ 
    "_id" : ObjectId("1bbb"), 
    "first_name" : "Dib", 
    "last_name"  : "Shabo",
    "_modified"  : "2019-01-21 13:32:11"
},
{ 
    "_id" : ObjectId("1ccc"), 
    "first_name" : "Sheesho", 
    "last_name"  : "Shabo",
    "_modified"  : "2019-01-21 11:30:11"
},
{ 
    "_id" : ObjectId("1ddd"), 
    "first_name" : "Dib", 
    "last_name"  : "Shabo",
    "_modified"  : "2018-03-01 13:32:11"
}

我希望得到这样的结果:

2019-01-24: 3
2019-01-22: 1
2019-01-21: 1
2018-03-01: 1

请注意,由于在2019-01-24上有一个后续事件(前一场比赛有30天),因此应该忽略2019-01-21以来的“ Dib Shabo”记录,但是来自应该算2018年3月1日,因为它不在30天的滚动窗口内。

我现有的问题是:

var myCursor = db.events.aggregate({ 
        $project : { day : {$substr: ["$_modified", 0, 10] }}},{ 
        $group   : { _id: "$day", number:{$sum:1}}},{ 
        $sort    : { _id : -1 }} 
); myCursor.forEach(printjson);

并返回:

 2019-01-24: 3
 2019-01-22: 1
 2019-01-21: 2
 2018-03-01: 1

这既不是30天滚动窗口,也不是重复名称!

我不知道如何将这两个额外条件添加到聚合中。 有人可以帮忙吗?

0 个答案:

没有答案