mongodb - 最近n天每天晚上10点至早上8点之间的汇总数据

时间:2017-10-12 11:17:34

标签: mongodb timestamp aggregation

我的mongodb有一些每小时的报告数据,其中包含每小时的数据。现在我们想要汇总数据,以便每n天获得一个小时的平均值。

如果我们尝试将平均值与时间范围00 AM到23:59 PM一天进行汇总示例:Day_1 01 AM到Day_1 23:59 PM我们得到预期的结果。

但问题在于尝试将平均值与两个不同日期之间的时间范围进行汇总。示例:从第1天晚上10点到第2天上午8点。

我们正在寻找一种解决方案,该方案将day_2数据视为day_1,并计算过去n天内两天的平均值。

以下是我们的样本数据作为我们遵循的逻辑。 样本数据:

{
    "TimeStamp" : ISODate("2017-08-17T22:00:00.000Z"),
    "A" : 100.0,
    "B" : 10.0,
    "C" : 30.0,
    "D" : 50.0
}
{
    "TimeStamp" : ISODate("2017-08-17T23:00:00.000"),
    "A" : 100.0,
    "B" : 10.0,
    "C" : 20.0,
    "D" : 30.0
}
{
    "TimeStamp" : ISODate("2017-08-18T06:00:00.000Z"),
    "A" : 100.0,
    "B" : 40.0,
    "C" : 10.0,
    "D" : 40.0
}
{
    "TimeStamp" : ISODate("2017-08-18T08:00:00.000Z"),
    "A" : 100.0,
    "B" : 50.0,
    "C" : 10.0,
    "D" : 50.0
}

{
    "TimeStamp" : ISODate("2017-09-01T22:00:00.000Z"),
    "A" : 100.0,
    "B" : 20.0,
    "C" : 10.0,
    "D" : 50.0
}

{
    "TimeStamp" : ISODate("2017-09-02T08:00:00.000Z"),
    "A" : 100.0,
    "B" : 60.0,
    "C" : 10.0,
    "D" : 70.0
}

查询是: 以下查询在00 AM到23:59 PM(同一日期)的时间范围内正常工作

 db.getCollection('prod_amount').aggregate( [ 
    { $project: {
        A: 1,        
        TimeStamp: 1, 
        dateField: {'$dateToString': {format: '%Y-%m-%d', date: '$TimeStamp'}},
        minutes: { $add: [
            { $multiply: [ { $hour: '$TimeStamp' }, 60 ] }, 
            { $minute: '$TimeStamp' } 
        ] } 
    } },
    { $match: {"TimeStamp":{$gte:new Date("2017-08-17"),$lte:new Date("2017-09-01")}, 'minutes' : { $gte : 10 * 60, $lte : 20 * 60 } } },
    { $group: {"_id":{dateField: '$dateField'}, Prod : {"$avg":"$A"}}}
])

帮助构建两个不同日期之间的时间范围查询。示例:从第1天晚上10点到第2天上午8点。

0 个答案:

没有答案