我的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点。