【问题标题】:MongoDB Aggregation Framework - How to Match by Date Range, Group By Days, and Return Average For Each Day?MongoDB 聚合框架 - 如何按日期范围、按天分组和每天返回平均值进行匹配?
【发布时间】:2014-05-11 09:12:43
【问题描述】:

我刚刚了解 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 
});

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

【问题讨论】:

    标签: javascript node.js mongodb express mongoose


    【解决方案1】:

    问题似乎出在您用于 $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 运算符从聚合查询中的date 字段中提取dayhour

    【讨论】:

    • 如果你有大文件,查询会很慢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 2020-02-14
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多