MongoDB - 从日期开始每七天汇总一次$ group

时间:2017-11-29 07:22:28

标签: mongodb mongodb-query aggregation-framework

假设集合中有任意数量的文档具有以下结构:

{ 
    "_id" : "1", 
    "totalUsers" : NumberInt(10000), 
    "iosUsers" : NumberInt(5000), 
    "androidUsers" : NumberInt(5000), 
    "creationTime" : ISODate("2017-12-04T06:14:21.529+0000")
},
{ 
    "_id" : "2", 
    "totalUsers" : NumberInt(12000), 
    "iosUsers" : NumberInt(6000), 
    "androidUsers" : NumberInt(6000), 
    "creationTime" : ISODate("2017-12-04T06:14:21.529+0000")
},
{ 
    "_id" : "3", 
    "totalUsers" : NumberInt(14000), 
    "iosUsers" : NumberInt(7000), 
    "androidUsers" : NumberInt(7000), 
    "creationTime" : ISODate("2017-12-04T06:14:21.529+0000")
}

并且想要编写一个返回两个给定日期之间结果的查询(例如:startDateendDate),然后每七天对结果进行分组:

db.collection.aggregate(
  { $match: {$gte: startDate, $lte: endDate } },
  { $group: { _id: { --- every seven days from endDate --- } }
)

我该怎么做?

1 个答案:

答案 0 :(得分:1)

首先获得边界

var boundries = [];
vat sd= ISODate("2017-10-18T20:41:33.602+0000"),ed=ISODate("2017-11-22T12:41:36.348+0000");
boundries.push(sd);

var i = sd;

while(i<=ed){
    //push ISODate(i + 7 days) in boundries
}

//also push ISODate(ed+1day) because upper bound is exclusive

//use $bucket aggregation
db.collection.aggregate({$match:{creationTime:{$gte:stDate,$lte:endDate}}},{
$bucket:{
    groupBy: "$creationTime", 
    boundaries:boundries ,
}

})