Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript MongoDB聚合框架-如何按日期范围进行匹配,按天数分组,并返回每天的平均值?_Javascript_Node.js_Mongodb_Express_Mongoose - Fatal编程技术网

Javascript MongoDB聚合框架-如何按日期范围进行匹配,按天数分组,并返回每天的平均值?

Javascript MongoDB聚合框架-如何按日期范围进行匹配,按天数分组,并返回每天的平均值?,javascript,node.js,mongodb,express,mongoose,Javascript,Node.js,Mongodb,Express,Mongoose,我刚刚了解了MongoDB的聚合框架,我想知道是否有人可以帮助我改进此查询,以执行以下操作: 查找/匹配日期介于提交范围之间的记录 按天将结果分组 每天的平均回报率 这是我的模型,有一些有用的属性可以让编写这个查询变得更容易,比如day属性 // Model var PriceHourlySchema = new Schema({ created: { type: Date, default: Date.now }, day: {

我刚刚了解了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 
});
这是我到目前为止的查询,它只返回范围内所有日期的总平均值,而不按天分组并返回每天的平均值,因此您可以按天分组

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的
\u id
上。如果要按天对结果进行分组,则应按
$day
分组,而不是按
null
分组。试试这个:

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

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

如果您有大型文档,该查询可能会很慢。