This is a little net health monitoring project I made in NodeJS. It pings google every second and stores the result (true/false) along with the date in a database (MongoDB). I've collected enough data and I want to represent it for the past week. I created a 2x2 array of 7 days and 24 hours each. I go through each record and map it to the appropriate day and hour of the week. And I give that hour a little score, if true +1, if false -5. And it creates a little matrix like this: [ [2015, 1724, 1733, 1679, ... [1818, 1909, 1614, 1829, ... [1632, 1778, 1726, 1657, ... ... ] The only problem is computation takes ~10-15 seconds and lots of CPU for going through ~200k records of just 3 days. Is there some scope for improvement here? days = days || 3; var counter = 0 this.find({ date: { // Date greater than (Now - X days) $gt: new Date(Date.now() - days * 24 * 3600 * 1000), }, }, function(err, datums) { var week = new Array(days); for (var i = 0; i < week.length; i++) week[i] = new Array(24); // Empty Week Matrix (7x24) datums.forEach(function(data) { counter++; var date1 = data.date; var date2 = new Date(); var timeDiff = Math.abs(date2.getTime() - date1.getTime()); var diffDays = Math.ceil(timeDiff / (1000 * 3600 * 24)); //stackoverflow.com/q/3224834/1266650 var day = days - diffDays; if (day < 0) return; var hour = data.date.getHours(); if (!week[day][hour]) week[day][hour] = 0; if (data.isNetAlive) week[day][hour]++; else week[day][hour] -= 5; }); console.debug(week); console.debug(counter, 'records'); });