toro_duque
toro_duque

Reputation: 23

MongoDB - aggregate $group by every seven days from a date

Suppose you have any number of documents in a collection with the following structure:

{ 
    "_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")
}

And want to write a query that returns results between two given dates (ie: startDate and endDate) and then group the results every seven days:

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

How can I do this?

Upvotes: 2

Views: 1039

Answers (1)

Shubham
Shubham

Reputation: 1426

First get boundries

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 ,
}

})

Upvotes: 3

Related Questions