我刚学习MongoDB的聚合框架,我想知道是否有人可以帮助我改进此查询以执行以下操作:
这是我的模型,有一些有用的属性可以让您更轻松地编写此查询,例如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
});
这是我的查询到目前为止,这只返回范围内包含的所有日期的总平均值,并且不按天分组并返回每天的平均值,因此您可以按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();
答案 0 :(得分:8)
问题似乎与您用于$ 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 Aggregation
运算符从汇总查询中的day
字段中提取hour
和date
。