MongoDB聚合框架 - 如何按日期范围,按天分组和每天的平均回报率进行匹配?

时间:2014-03-31 20:31:59

标签: javascript node.js mongodb express mongoose

我刚学习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();

1 个答案:

答案 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字段中提取hourdate