MongoDB聚合框架 – 如何按date范围,按天分组以及每天的平均收益进行匹配?

我只是了解MongoDB的聚合框架,我想知道是否有人可以帮助我改进这个查询来做到以下几点:

  • 在提交的范围之间查找/匹配包含date的logging
  • 按天分组结果
  • 每天返回平均值

这里是我的模型,有一些有用的属性,使这个查询更容易,如day属性…

 // Model var PriceHourlySchema = new Schema({ created: { type: Date, default: Date.now }, day: { type: String, required: true, trim: true }, hour: { type: String, required: true, trim: true }, price: { type: Number, required: true }, date: { type: Date, required: true } }, { autoIndex: true }); 

这是我迄今为止的查询,这只返回范围内包含的所有date的总平均值,并不按date分组,并返回每天的平均值,因此您可以按day分组。

 var start = moment.utc(req.query.start).startOf('year').toDate(); var end = moment.utc(req.query.start).add('years',1).startOf('year').add('hours',1).toDate(); PriceHourly.aggregate([ { $match: { date: { $gt: start, $lt: end } } }, { $group: { _id: null, price: { $avg: '$price' } } } ], function(err, results){ console.log(results); }); // PriceHourly(); 

这个问题似乎与你用于$ group的_id有关。 如果您想按天分组结果,您应该按$day而不是null分组。 尝试这个:

 PriceHourly.aggregate([ { $match: { date: { $gt: start, $lt: end } } }, { $group: { _id: "$day", price: { $avg: '$price' } } } ], function(err, results){ console.log(results); }); 

也就是说,您不需要将date和小时作为单独的元素存储在文档中。 这是多余的数据。 您可以使用Date Aggregation运算符从聚合查询中的Date Aggregation字段中提取dayhour