Le problème semble être avec le _id vous utilisez pour $group. Vous devez regrouper par $day plutôt que null , si vous souhaitez regrouper les résultats par jour. Essayez ceci :
PriceHourly.aggregate([
{ $match: { date: { $gt: start, $lt: end } } },
{ $group: { _id: "$day", price: { $avg: '$price' } } }
], function(err, results){
console.log(results);
});
Cela dit, vous n'avez pas besoin de stocker le jour et l'heure en tant qu'éléments distincts dans le document. Ce sont des données redondantes. Vous pouvez extraire le day et hour à partir de date champ dans la requête d'agrégation à l'aide de Date Aggregation
opérateurs.